- 引用拷贝:引用拷贝就是两个不同的引用指向同一个对象。
- 浅拷贝:浅拷贝会在堆上创建一个新的对象(不同于引用拷贝的一点),如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址(不会创建新的内部对象),拷贝对象和原对象共用同一个内部对象。
- 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

例子:
引用拷贝:
Address 类(作为 Person 的引用类型属性)
public class Address{
private String place;
public Address(String place) {
this.place = place;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
}
Person 类(含引用类型属性 Address)
public class Person{
private Address address;
public Person(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
验证
Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//true
System.out.println(Person1 == Person1Copy);
//true
System.out.println(Person1.getAddress() == Person1Copy.getAddress())
结果:


浅拷贝:
实现
Cloneable接口,并重写了clone()方法。
clone()方法的实现:直接调用的是父类Object的clone()方法。
Address 类(作为 Person 的引用类型属性)
public class Address implements Cloneable{
private String place;
public Address(String place) {
this.place = place;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
Person 类(含引用类型属性 Address)
public class Person implements Cloneable{
private Address address;
public Person(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
验证
Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//false
System.out.println(Person1 == Person1Copy);
//true
System.out.println(Person1.getAddress() == Person1Copy.getAddress())
结果:

深拷贝:
对
Person类的clone()方法进行修改,连带着要把Person对象内部的Address对象一起复制。
Person 类的 clone() 方法
@Override
public Person clone() {
try {
Person clone = (Person) super.clone();
clone.setAddress(clone.getAddress().clone());
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
验证
Person Person1 = new Person(new Address("巢都"));
Person Person1Copy = Person1.clone();
//false
System.out.println(Person1 == Person1Copy);
//false
System.out.println(Person1.getAddress() == Person1Copy.getAddress());
结果:



3022

被折叠的 条评论
为什么被折叠?



