介绍 深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。 浅拷贝 :浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
举例 浅拷贝 我们实现Cloneable
接口,重写clone()
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 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(); } }
测试
1 2 3 4 Person person = new Person (new Address ("长沙" ));Person person1 = person.clone(); System.out.println(person == person1); System.out.println(person.getAddress() == person1.getAddress());
两个Address都指向同一块内存中的数据
深拷贝 修改浅拷贝的Person
类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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; } }
测试
1 2 3 4 Person person = new Person(new Address("长沙" )) Person person1 = person.clone() System.out.println(person = = person1) System.out.println(person.getAddress() = = person1.getAddress())
person1的address也已经被clone
引用拷贝、浅拷贝、深拷贝三者区别 惨考链接:Java Guide 深拷贝和浅拷贝区别