在Java中,有時候需要對一個對象進行拷貝,操作對象屬性時不影響原對象。但是由于Java中的賦值和拷貝機制,賦值只是復制一個引用指向原有的對象,導致對其中一個對象的修改會對原有對象產生影響。此時就出現(xiàn)了深度拷貝的概念。
//賦值代碼 Person person1 = new Person(); Person person2 = person1; person1.setName("Tom"); System.out.println(person2.getName());//輸出Tom
將一個實體對象賦值給另一個對象時,即使原對象屬性改變,由于兩個對象引用了同一個內存地址,最后輸出結果仍然一致。
下面是Java中深度拷貝的實現(xiàn)方法:
//實現(xiàn)Cloneable接口,重寫clone方法 public class Person implements Cloneable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重寫對象的clone方法 @Override public Object clone() throws CloneNotSupportedException{ Person clone = (Person) super.clone(); return clone; } } //使用clone方法進行深度拷貝 Person person1 = new Person(); Person person2 = (Person) person1.clone(); person1.setName("Tom"); System.out.println(person1.getName());//輸出Tom System.out.println(person2.getName());//輸出null
通過實現(xiàn)Cloneable接口,對象重寫clone方法實現(xiàn)對象的深度拷貝。
需要注意的是,在進行深度拷貝時,要確保對象內部的屬性也可以被拷貝,否則拷貝出來的對象仍然會受到原對象的影響。對于Java里的大多數(shù)內置類型,都提供了相應的深度拷貝方法或者構造函數(shù),開發(fā)者只需要根據(jù)需要選擇即可。