编程语言的Copy基本分为引用Copy,浅Copy和深Copy。
引用Copy比较简单,我们将一个引用指向一个对象,就是一个引用Copy,引用Copy不会新建对象,只会将引用指向已存在的对象,代码如下:
Object o1 = new Object(); Object o2 = o1;
浅Copy是Java默认的Copy方法,在调用clone()方法时,Java将进行浅Copy,在该过程中,Java对该对象进行Copy,对其中的基本数据类型进行Copy,但是对该对象内部的引用,不进行Copy,也就是说Copy后新对象属性中的引用还是指向原对象的属性。浅Copy代码如下:
class Province implements Cloneable {
private String name;
public String getName() {
return name;
} public
void setName(String name) {
this.name = name;
}
public Province() {
super();
}
public Province(String name) {
super();
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override public String toString() {
return name.toString();
}
}
深Copy是要将新对象中的引用也做clone,也就是新建一个全新的对象,实现原理是在写clone方法时对该对象中的引用分别调用clone方法,代码如下 :
class City implements Cloneable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Province province;
public Province getProvince() {
return province;
}
public void setProvince(Province province) {
this.province = province;
}
public City(String name, Province province) {
super();
this.name = name;
this.province = province;
}
public City() {
super();
}
@Override
public Object clone() throws CloneNotSupportedException {
City city = (City) super.clone();
city.province = (Province) province.clone();
return city;
}
@Override public String toString() {
return province.toString() + ":" + name.toString();
}
}