浅拷贝是指:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制。
深拷贝是指:不仅复制当前的对象,如果对象中还存在引用,则将引用的对象一起复制。
java中使用到的clone方法是浅拷贝,下面是简单演示:
首先定义一个简单类A,申明一个属性aa = 1;
public class A {
int aa = 1;
}
定义一个可克隆类C,在C类中申明了类A、一个int属性b值为1;
public class C implements Cloneable{
A a = new A();
int b = 1;
public Object clone(){
Object c = null;
try {
c = super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return c;
}
}
在测试类中,创建一个c类的对象,申明c1为c的克隆对象,在克隆后再次将c类中b属性的值赋为10,A类中aa属性赋值为10;
public class Test {
public static void main(String[] args) {
C c = new C();
C c1 = (C)c.clone();
c.a.aa = 10;
c.b = 10;
System.out.println(c.a.aa);
System.out.println(c1.b);
}
}
输出的值依次为10和1;
可见C类中的A类并没有被拷贝过来而只是获得了引用。
通过序列化方式实现深拷贝:先将要拷贝对象写入到内存中的字节流中,然后再从这个字节流中读出刚刚存储的信息,作为一个新对象返回,那么这个新对象和原对象就不存在任何地址上的共享,自然实现了深拷贝。