java淺克隆和深克隆的實現
在Java中,克隆是指復制一個對象,生成一個與原對象具有相同的屬性和方法的新對象。Java中主要有兩種克隆方式——淺克隆和深克隆。
淺克隆
淺克隆是指只復制對象的基本數據類型和對其他對象的引用,而不執行任何對象的復制操作。換句話說,淺克隆只是對對象和其中引用的對象創建新的引用,而沒有對對象的內容進行復制。
public class Person implements Cloneable { private String name; private Integer age; private Listhobbies; // 省略getter、setter等方法 @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
在上面的代碼中,Person類實現了Cloneable接口,并重寫了clone方法。默認情況下,調用克隆方法會返回一個淺克隆的對象。
public class Main { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); person1.setName("張三"); person1.setAge(20); Listhobbies = new ArrayList<>(); hobbies.add("籃球"); person1.setHobbies(hobbies); Person person2 = (Person) person1.clone(); System.out.println(person1 == person2); // false System.out.println(person1.getHobbies() == person2.getHobbies()); // true } }
在上面的代碼中,我們創建了一個Person對象person1,并將其克隆到person2中。驗證發現person1和person2的地址不相同,而person1和person2中的hobbies對象引用相同,這說明只有對象的基本數據類型和引用被復制了。
深克隆
深克隆是指對一個對象及其引用的對象進行復制,生成一個完全相同的新對象。換句話說,深克隆會對原對象及其引用的對象進行遞歸復制。
public class Person implements Cloneable { private String name; private Integer age; private Listhobbies; // 省略getter、setter等方法 @Override public Object clone() throws CloneNotSupportedException { Person person = (Person) super.clone(); List hobbies = new ArrayList<>(this.hobbies); person.setHobbies(hobbies); return person; } }
在上面的代碼中,Person類重新定義了clone方法。首先調用了父類的clone方法創建對象的淺拷貝,然后對hobbies對象進行深度復制。
public class Main { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); person1.setName("張三"); person1.setAge(20); Listhobbies = new ArrayList<>(); hobbies.add("籃球"); person1.setHobbies(hobbies); Person person2 = (Person) person1.clone(); System.out.println(person1 == person2); // false System.out.println(person1.getHobbies() == person2.getHobbies()); // false } }
在上面的代碼中,我們創建了一個Person對象person1,并將其克隆到person2中。驗證發現person1和person2的地址不相同,同時person1和person2中的hobbies對象也不相同,這說明對象和對象中的引用都被復制了。