java默认采用=复制的对象均是引用复制,也即使得两个指针的值相等,其还是指向同一个对象
要想真的copy一个对象必须实现Clonable接口并添加clone方法
public class CompositeEntity implements Cloneable{
private String compositeString = "";
public String getCompositeString() {
return compositeString;
}
public void setCompositeString(String compositeString) {
this.compositeString = compositeString;
}
public CompositeEntity(String str){
super();
this.compositeString = str;
}
public Object clone(){
CompositeEntity oEntity = null;
try {
oEntity = (CompositeEntity) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return oEntity;
}
}
如此一来默认Object的clone方法native实现是内存中另开辟一块区域存放新对象并把老对象的所有property按值拷贝给新对象的property,也即浅拷贝,要形成复杂的深拷贝必须对property为引用类型的属性也执行clone
public Object clone(){
Entity oEntity = null;
try {
oEntity = (Entity) super.clone();
oEntity.compositeEntity = (CompositeEntity)this.compositeEntity.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return oEntity;
}
数组不管是使用clone、Arrays.copyOf、Systems.arrayCopy都是浅拷贝,要实现深拷贝必须自己循环便利数组并一个一个对象clone出来
容器也是同理