对于C语言,简单的来说就是,在有指针的情况下,浅复制只是增加了一个指针指向已经存在的内存,而深复制就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。
由于浅复制是多个指针指向同一块内存,在释放内存的时候不小心会出现重复释放同一块内存的错误,而采用深复制则不会出现这种情况。
对于Java语言,简单的来说就是,浅复制是指复制对象时仅仅复制对象本身,而不复制对象中包含的引用类型指向的对象;深复制不仅复制对象本身,而且复制对象包含的引用所指向的对象。
下面例举一个Java的例子:
public class UselessClass {
public static void main(String[] args) throws Exception {
Husband husband1 = new Husband("汪峰",new Wife("章子怡"));
//浅复制一个husband
Husband husband2 = (Husband) husband1.clone();
husband2.name = "马云";
husband2.wife.name = "张瑛";
System.out.println("丈夫的名字是:" + husband1.name + " 妻子的名字是:" + husband1.wife.name);
}
}
class Wife implements Cloneable {
public String name;
public Wife(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Husband implements Cloneable {
public String name;
public Wife wife;
public Husband(String name, Wife wife) {
this.name = name;
this.wife = wife;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:张瑛
从上面的例子我们可以看出,当我们修改husband2名字的时候,husband1的名字并没有改变。然而,修改husband2妻子名字的时候,husband1的妻子的名字却发生了改变,这足以证明浅复制仅仅复制了对象本身,而不复制对象中包含的引用类型指向的对象。
如果想要深复制,则把上面Husband中的clone方法做如下更改:
@Override
protected Object clone() throws CloneNotSupportedException {
Husband husband = (Husband) super.clone();
husband.wife = (Wife) wife.clone();
return husband;
}
上面代码输出的结果是:丈夫的名字是:汪峰 妻子的名字是:章子怡