一、對象複製的基本概念
對象複製是指在程序設計過程中將一個對象的內容(包括它所引用的其他對象)複製到另一個對象中。在Java中,對象複製分為深拷貝和淺拷貝兩種方式。
二、Java實現對象複製的方式
1、Cloneable接口實現對象複製
對於Java中的深淺拷貝,Java提供了一個Cloneable接口,實現該接口的類可以使用Object類的clone方法來獲取該對象的一個副本,但是需要注意的是,clone方法是protected類型,需要在子類中重寫此方法實現淺拷貝或深拷貝。
class Person implements Cloneable { private String name; private int age; private ArrayList hobbies; // 構造方法省略 // 重寫clone方法 @Override public Object clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); // 對hobbies進行深拷貝 p.hobbies = (ArrayList) this.hobbies.clone(); return p; } } // 調用方式 Person p1 = new Person("Tom", 18); p1.addHobby("swimming"); Person p2 = (Person) p1.clone(); System.out.println(p2.getName()); // Tom System.out.println(p2.getAge()); // 18 System.out.println(p2.getHobbies().size()); // 1
2、序列化實現對象複製
另一種實現對象複製的方式是使用Java的序列化(Serialization)機制。序列化將對象轉換成一個位元組序列,可以在網絡上傳輸或在各層之間傳遞,也可以將其保存到本地文件中。反序列化就是將位元組序列還原成對象,因此可以使用序列化實現對象的深拷貝。需要注意的是,被複制的對象及其引用類型需要實現Serializable接口。
class Person implements Serializable { private String name; private int age; private ArrayList hobbies; // 構造方法省略 // 對象深拷貝方法 public Person clone() throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (Person) ois.readObject(); } } // 調用方式 Person p1 = new Person("Tom", 18); p1.addHobby("swimming"); Person p2 = p1.clone(); System.out.println(p2.getName()); // Tom System.out.println(p2.getAge()); // 18 System.out.println(p2.getHobbies().size()); // 1
三、淺拷貝與深拷貝
1、淺拷貝
淺拷貝是指複製對象時,僅僅是對對象中的基本數據類型進行複製,而引用類型只是對其引用進行了複製,沒有實現深拷貝。在Java中,使用Cloneable接口實現淺拷貝時,需要注意對引用類型進行特別處理。
class Person implements Cloneable { private String name; private int age; private ArrayList hobbies; // 構造方法省略 // 重寫clone方法 @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } // 調用方式 Person p1 = new Person("Tom", 18); p1.addHobby("swimming"); Person p2 = (Person) p1.clone(); System.out.println(p2.getName()); // Tom System.out.println(p2.getAge()); // 18 System.out.println(p2.getHobbies().size()); // 1
2、深拷貝
深拷貝是指將複製對象中的基本數據類型和其引用類型均進行複製。實現深拷貝的方法主要有兩種,一種是使用Cloneable接口,另一種是使用序列化,需要注意對引用類型的處理。
參見前文代碼示例。
總結
本文從對象複製的基本概念、Java實現對象複製的方式、深淺拷貝等多個方面對Java複製對象做了詳細的闡述。對於Java中的對象複製,需要根據具體需求選擇實現深拷貝或淺拷貝的方式。
原創文章,作者:UWPF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/133092.html