深拷贝和浅拷贝区别
一个实例经过拷贝之后,在新生成的实例中,引用类型的成员变量的内存地址未做改变,和原实例的内存地址相同,这是浅拷贝
反之,若和原实例的引用类型成员变量的内存地址不同,则是深拷贝。这里不考虑基本类型的成员变量。
下面是一个Java例子,便于对概念的理解:
package com.example.butterknife_compiler;
/**
* Created by Administrator on 2018/3/26.
*/
public class OutClass implements Cloneable {
InnerClass innerClass;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
OutClass outClass=new OutClass();
outClass.innerClass=new OutClass().new InnerClass();
//这里clone一个新的实例
OutClass outClass2= (OutClass) outClass.clone();
//比较outClass和outClass2的引用型变量-->innerClass
System.out.println(outClass.innerClass==outClass2.innerClass);
}
public class InnerClass implements Cloneable {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
}
那么如果innerClass这个引用型变量在两个实例中的地址是相同的,则是浅拷贝,我们看下打印:
那么问题来了,怎么才能让做到深拷贝呢?很简单,就是让我们的引用型成员变量继续clone
public class OutClass implements Cloneable {
InnerClass innerClass;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
OutClass outClass=new OutClass();
outClass.innerClass=new OutClass().new InnerClass();
OutClass outClass2= (OutClass) outClass.clone();
//重点在这里,让引用型成员变量继续clone
outClass.innerClass= (InnerClass) outClass.innerClass.clone();
System.out.println(outClass.innerClass==outClass2.innerClass);
}
public class InnerClass implements Cloneable {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
}
看下执行结果: