介绍
深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
举例
浅拷贝
我们实现Cloneable接口,重写clone()方法
public class Address implements Cloneable{
private String addressName;
public Address(String addressName) {
this.addressName = addressName;
}
public String getAddressName() {
return addressName;
}
public void setAddressName(String addressName) {
this.addressName = addressName;
}
@Override
protected Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}
测试
Person person = new Person(new Address("长沙"));
Person person1 = person.clone();
System.out.println(person == person1); //输出false
System.out.println(person.getAddress() == person1.getAddress()); //输出true
两个Address都指向同一块内存中的数据
深拷贝
修改浅拷贝的Person类
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
protected Person clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
}
}
测试
Person person = new Person(new Address("长沙"));
Person person1 = person.clone();
System.out.println(person == person1); //输出false
System.out.println(person.getAddress() == person1.getAddress()); //输出false
person1的address也已经被clone
引用拷贝、浅拷贝、深拷贝三者区别
原文链接:Java Guide 深拷贝和浅拷贝区别