浅拷贝
对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。“里面的对象”会在原来的对象和副本对象之间共享。例如,我们有一个Person对象。
public class Person{
private Name name;
private Address address;
}
我们对Person对象进行拷贝,而两个对象会共享Name和Address对象。拷贝构造器originalPerson 对象,然后对其应用变量进行复制。
public class Person {
private Name name;
private Address address;
public Person(Person originalPerson) {
this.name = originalPerson.name;
this.address = originalPerson.address;
}
}
浅拷贝的问题就是两个对象并非独立的,其中一方改变了变量另一方也会改变。
Person mother = new Person(new Name(…), new Address(…));
Person son = new Person(mother);
son.moveOut(new Street(…), new City(…));
深拷贝
不同于浅拷贝,深拷贝是一个整个独立的对象拷贝。如果我们对整个 Person对象进行深拷贝,我们会对整个对象的结构都进行拷贝。
深拷贝在使用拷贝构造器进行拷贝时,里面的对象也会调用自身的拷贝构造器。
public class Person {
private Name name;
private Address address;
public Person(Person otherPerson) {
this.name = new Name(otherPerson.name);
this.address = new Address(otherPerson.address);
}
}
要创建一个真正的深拷贝,就需要我们一直这样拷贝下去,一直覆盖到 Person 对象所有的内部元素, 最后只剩下原始的类型以及“不可变对象(Immutables)”。让我们观察下如下这个 Street 类以获得更好的理解:
public class Street {
private String name;
private int number;
public Street(Street otherStreet){
this.name = otherStreet.name;
this.number = otherStreet.number;
}
}
详细参考:https://www.oschina.net/translate/java-copy-shallow-vs-deep-in-which-you-will-swim#comments