首頁  >  文章  >  Java  >  Java 中的物件克隆

Java 中的物件克隆

WBOY
WBOY原創
2024-08-30 16:04:50799瀏覽

作為最廣泛使用的程式語言之一,Java 具有廣泛的特性和功能。 Java 中的物件用於完成任務;你建立物件、改變、移動、呼叫它們各自的方法等等。眾所周知,對物件的引用儲存在Java中。因此,當我們有兩個引用指向同一個物件時,任何一個物件的變更都會完全反映在另一個物件的相同變更中。現在,這個因素可能並不總是對我們有利,因此克隆是阻止這種情況的答案。換句話說,創建此類物件的精確副本在 Java 中稱為物件克隆。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

根據定義,物件克隆是建立具有相似狀態的原始物件的精確副本的過程。克隆時,所有屬性都會轉移到新克隆的對象,但可以根據需要更改或操作這些屬性。必須在 Object 類別中定義 clone() 方法。對於我們打算克隆物件的類別來說,必須實作 java.lang.A Cloneable 介面。如果未能實現 Cloneable 接口,則會拋出異常。現在讓我們來看看物件克隆的語法。

文法:

protected Object clone() throws CloneNotSupportedException

對於Object類,具體的克隆操作是透過clone方法來進行的。此方法將建立該類別的精確副本,並使用物件欄位的內容初始化所有欄位。如果所提到的物件的類別沒有實作Cloneable接口,則會拋出「CloneNotSupportedException」。所有數組都被認為實作了 Cloneable 介面。這裡,介面 Cloneable 沒有在類別 Object 上實作。因此,當我們在物件上呼叫克隆方法時,它會拋出運行時錯誤。

Java 中物件克隆的工作原理

現在讓我們透過示範來了解clone()方法的工作原理。

代碼:

class obj_clone implements Cloneable{
int phone_code;
String f_name;
obj_clone(int phone_code,String f_name){
this.phone_code=phone_code;
this.f_name=f_name;
}
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String args[]){
try{
obj_clone s1=new obj_clone(99,"sulaksh");
obj_clone s2=(obj_clone)s1.clone();
System.out.println(s1.phone_code+" "+s1.f_name);
System.out.println(s2.phone_code+" "+s2.f_name);
}catch(CloneNotSupportedException c){}
}
}

程式碼說明:如您所見,我們初始化了我們的類別並實現了可複製。在這裡,檢查實際的類別是否實作了可克隆,並在物件中使用clone(),然後繼續建立副本。然後我們有兩個變數:電話號碼(整數資料型別)和名字(字串資料型別)。然後我們創建了 obj_clone 類別的建構子以及帶有 .this 關鍵字的變數。正如您所看到的,我們的物件帶有clone()方法和我們之前討論過的異常CloneNotSupportedException。此外,這裡的 super.clone() 可能會拋出 CloneNotSupportedException 錯誤,我們稍後捕獲了該錯誤。

然後我們有了主類,並且我們對其中的所有內容都使用了 try-catch。然後我們創建了我們類別的一個物件作為 s1 和 s2。我們已經傳遞了第一個物件 s1 的兩個參數,然後我們實作了clone() 方法來將 s1 克隆到 s2 中。最後,我們有兩個輸出列印語句。在 try 區塊之外,我們有帶有前面討論的異常的 catch 區塊。在範例的第 8th 行,我們已經實作了語法部分中提到和解釋的clone()。執行後,上述程式將列印輸出「99sulaksh 99sulaksh」。有關輸出,請參閱下面所附的螢幕截圖。

輸出:

Java 中的物件克隆

Java 中物件克隆的類型

現在我們已經了解了什麼是物件克隆以及它是如何完成的,讓我們了解 Java 支援哪些克隆類型。

  • 淺克隆:每當實作預設克隆方法時,都會發生淺克隆。淺克隆只是將物件的所有欄位複製到新實例中。淺克隆由clone()支援。
  • 深度克隆:現在,每次我們不實作預設克隆方法時,我們都在練習深度克隆。深度克隆可以滿足我們的需求。現在,這裡的主要區別是深度克隆複製所有字段以及物件的值,而淺克隆僅複製字段。
  • 延遲克隆:Java 支援第三種克隆類型,它是上述兩種克隆類型的組合;它被稱為惰性克隆。對於何時使用哪種克隆類型並沒有具體的規則;我們根據自己的需求來決定。

物件克隆的優點和缺點

現在,讓我們來了解物件克隆的優點和缺點。

優點

了解一切或每種方法都有其自身的限制和功能,以下是克隆的優點。

  • 它節省時間和工作,因為克隆是一種節省時間的方法;您不必編寫相同的長程式碼。
  • 在已開發的專案上實作時,複製是複製物件最有效的方法。
  • 它有最快的方法來使用 Clone() 複製陣列。

缺點

就像前面提到的,每種方法都有其限制和功能,現在讓我們了解 Clone() 的缺點。

  • 為了讓 JVM 理解我們將使用clone(),我們必須實現 Cloneable 接口,即使這個可克隆接口沒有任何方法。
  • 對於深克隆,我們必須重寫object.clone(),因為它基本上支援淺克隆。
  • 我們無法控制物件構造,因為 clone() 不會呼叫任何構造函數。
  • 基本上,要實作object.clone(),我們必須在程式碼中進行相當多的更改,從Cloneable介面的實作開始,然後是clone()方法定義以處理CloneNotSupportedException等。

正確理解clone()或任何其他方法的優點和缺點,實現如此精彩的方法和函數可以讓程式設計師受益匪淺。

結論

我們了解了clone()是什麼、它的功能和用途。深克隆和淺克隆之間的區別以及惰性克隆。淺克隆僅複製字段,而深克隆複製字段和值,可以根據需要實施。而惰性複製則是兩者的結合。我們也了解了克隆的優點和缺點()。

以上是Java 中的物件克隆的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn