clone()方法用於建立實作Cloneable介面的類別的物件副本。預設情況下,它會逐字段複製,因為 Object 類別不知道其物件呼叫此方法的特定類別的成員。因此,如果該類別僅具有原始資料類型成員,則將建立該物件的新副本,並傳回對新物件副本的參考。但是,如果類別包含任何類別類型的成員,則僅複製對這些成員的物件引用,因此原始物件和複製物件中的成員引用都引用相同物件。
如果我們嘗試對未實作 Cloneable 介面的類別的物件呼叫 clone() 方法,我們將收到 CloneNotSupportedException 。此介面是一個標記介面,該介面的實作僅表示可以在實作類別的物件上呼叫Object.clone()方法。
<strong>protected Object clone() throws CloneNotSupportedException</strong>
我們可以透過兩種方式實作clone()方法
這就是Object.clone()提供的預設克隆功能的結果 方法(如果類別也有非基本資料型別成員)。在淺複製的情況下,複製物件也會引用原始物件所引用的相同對象,因為僅複製物件引用,而不複製引用的物件。
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("Tutorialspoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
Welcome to Tutorialspoint! Welcome to Tutorialspoint!
我們需要為非基本類型的類重寫clone()方法成員來實作深度複製,因為它還需要複製成員對象,而預設複製機制不會這樣做。
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" TutorialsPoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
Welcome to TutorialsPoint! Welcome to
以上是在Java中,clone()方法的重要性是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!