深度復(fù)制:復(fù)制一個對象時并且復(fù)制了該對象的引用(引用的引用扔涧。囤踩。珍特。)祝峻。
淺度復(fù)制:僅僅復(fù)制該對象的成員變量(基本類型、基本類型的包裝類型以及類實例)的值扎筒,對引用以及引用對象并沒有復(fù)制莱找,還是指向同一塊內(nèi)存。
java里沒有真正意義上的深度復(fù)制嗜桌,當(dāng)你復(fù)制一個對象時奥溺,該對象的引用與被復(fù)制對象的引用指向的是同一塊內(nèi)存地址,如果修改引用對象的成員變量骨宠,那么被復(fù)制對象的引用對象的成員變量也會被修改浮定,這個時候,這倆個對象的引用變量指向的是同一塊內(nèi)存地址层亿。這倆個引用對象用 == 比較返回true桦卒。但是當(dāng)修改對象的成員變量時,會開辟新的內(nèi)存匿又。對于引用對象來說方灾,只有將引用對象(指修改這個引用對象整體,而不是修改某一個成員變量)指向一個新的該引用對象實例時碌更,會開辟新的空間裕偿,或者將其中一個引用對象(比如原對象的引用對象)置為null,但是復(fù)制的對象的引用對象不會改變痛单。
要實現(xiàn)深度復(fù)制泉蝌,那么原對象需要重寫clone()方法逊朽,引用對象也需要重寫clone()方法鳍徽,如果引用對象還包含引用霹期,那么引用的引用也需要重寫clone()谆棱。還有一種是序列化對象,再轉(zhuǎn)回該對象時也實現(xiàn)了深度復(fù)制圆仔。
深度復(fù)制和淺度復(fù)制只是一種概念垃瞧,看業(yè)務(wù)場景需要使用。
包含深度復(fù)制和淺度復(fù)制的demo:
public class DeepCopyi mplements Cloneable{
private Integer age;
private String name;
DeepCopyEntity deepCopyEntity;
DeepCopy(DeepCopyEntity deepCopyEntity,Integer age,String name){
this.deepCopyEntity= deepCopyEntity;
this.age= age;
this.name= name;
}
DeepCopy(DeepCopy deepCopy){
this.age= deepCopy.age;
this.name= deepCopy.name;
this.deepCopyEntity= deepCopy.deepCopyEntity;
}
protected DeepCopyclone() throws CloneNotSupportedException {
DeepCopy deepCopy = (DeepCopy)super.clone();
deepCopy.deepCopyEntity = deepCopyEntity.clone();//要實現(xiàn)深度克隆坪郭,那么引用的對象也要實現(xiàn)Cloneable接口个从,進行深度復(fù)制
return deepCopy;
}
public static void main(String[] args) throws CloneNotSupportedException {
DeepCopy deepCopy =newDeepCopy(newDeepCopyEntity(1222,"jack"),2222,"james");
DeepCopy deepCopy1 = deepCopy.clone();//深度拷貝
//
DeepCopy deepCopy2 =newDeepCopy(deepCopy);//淺拷貝
//
//
System.out.println(deepCopy.name== deepCopy1.name);
System.out.println(deepCopy.age== deepCopy1.age);
System.out.println();
System.out.println(deepCopy.name== deepCopy2.name);
System.out.println(deepCopy.age== deepCopy2.age);
System.out.println();
//? ? ? ? deepCopy2.deepCopyEntity = null;
//如果是修改成員對象的某一個成員變量,那么對于淺度復(fù)制來說歪沃,被復(fù)制的成員對象的該成員變量也會被修改嗦锐,還是指向同一塊內(nèi)存
deepCopy2.deepCopyEntity.setName("111");
//如果是修該成員變量,那么就會開辟一塊新的內(nèi)存
deepCopy2.deepCopyEntity= deepCopy1.deepCopyEntity;
System.out.println(deepCopy.deepCopyEntity== deepCopy1.deepCopyEntity);//深
System.out.println(deepCopy.deepCopyEntity== deepCopy2.deepCopyEntity);//淺
}
}
成員對象類:
packagecom.test.demo.TestCopy;
/**
* Created by hasee on 2017/8/18.
*/
public class DeepCopyEntity implements Cloneable{
private intage;
privateStringname;
DeepCopyEntity(intage,String name){
this.age= age;
this.name= name;
}
protected DeepCopyEntity clone() throws CloneNotSupportedException {
return(DeepCopyEntity)super.clone();
}
public intgetAge() {
returnage;
}
publicStringgetName() {
returnname;
}
public voidsetName(String name) {
this.name= name;
}
}