在Java中,對象的拷貝分為深拷貝和淺拷貝。當(dāng)我們需要復(fù)制一個對象時,無論是深拷貝還是淺拷貝,都需要調(diào)用clone()方法。下面我們來看一下這兩種拷貝的實現(xiàn)。
淺拷貝
淺拷貝就是將一個對象的引用賦值給另一個對象。也就是說,當(dāng)我們修改其中一個對象時,另一個對象也會受到影響。代碼如下:
public class Person implements Cloneable { private String name; private Integer age; private Address address; //省略setter和getter方法 //實現(xiàn)clone()方法 public Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Address { private String province; private String city; private String district; //省略setter和getter方法 //實現(xiàn)clone()方法 public Object clone() throws CloneNotSupportedException { return super.clone(); } } //測試代碼 public static void main(String[] args) throws Exception { Person person1 = new Person(); person1.setName("張三"); person1.setAge(18); Address address1 = new Address(); address1.setProvince("廣東省"); address1.setCity("深圳市"); address1.setDistrict("寶安區(qū)"); person1.setAddress(address1); Person person2 = (Person) person1.clone(); System.out.println(person1.getName() == person2.getName()); // true System.out.println(person1.getAge() == person2.getAge()); // true System.out.println(person1.getAddress() == person2.getAddress()); // true }
從上面的代碼可以看出,當(dāng)我們修改person2的address對象時,person1的address對象也會發(fā)生變化。這就是淺拷貝的特點。
深拷貝
深拷貝就是將一個對象的所有屬性都復(fù)制一份到另一個對象中,包括引用類型的屬性。也就是說,當(dāng)我們修改其中一個對象時,另一個對象不會受到影響。代碼如下:
public class Person implements Cloneable { private String name; private Integer age; private Address address; //省略setter和getter方法 //實現(xiàn)clone()方法 public Object clone() throws CloneNotSupportedException { Person person = (Person) super.clone(); person.setAddress((Address) address.clone()); return person; } } public class Address implements Cloneable { private String province; private String city; private String district; //省略setter和getter方法 //實現(xiàn)clone()方法 public Object clone() throws CloneNotSupportedException { return super.clone(); } } //測試代碼 public static void main(String[] args) throws Exception { Person person1 = new Person(); person1.setName("張三"); person1.setAge(18); Address address1 = new Address(); address1.setProvince("廣東省"); address1.setCity("深圳市"); address1.setDistrict("寶安區(qū)"); person1.setAddress(address1); Person person2 = (Person) person1.clone(); System.out.println(person1.getName() == person2.getName()); // true System.out.println(person1.getAge() == person2.getAge()); // true System.out.println(person1.getAddress() == person2.getAddress()); // false }
從上面的代碼可以看出,當(dāng)我們修改person2的address對象時,person1的address對象不會發(fā)生變化。這就是深拷貝的特點。
下一篇python界面動效