首頁  >  文章  >  Java  >  簡述Java中淺克隆與深度克隆所要涉及的clone()方法

簡述Java中淺克隆與深度克隆所要涉及的clone()方法

Y2J
Y2J原創
2017-05-04 10:11:072206瀏覽

Java克隆(Clone)是Java語言的特性之一,這篇文章主要介紹了Java中的Clone機制是如何運作的,需要的朋友可以參考下

   現在Clone已經不是一個新鮮字了,伴隨著「多莉」的產生這個字確實很「火」過一陣子,在Java中也有這麼一個概念,它可以讓我們很方便的「製造」出一個物件的副本來,以下來具體看看Java中的Clone機制是如何運作的?

     1. Clone&Copy

     假設現在有Employee對象,Employee tobby =new Employee(“CMTobby”,5000),通
常常我們會有這樣的賦值Employee cindyelf=tobby,這個時候只是簡單了copy了一下reference,cindyelf和tobby都指向內存中同一個object,這樣cindyelf或者tobby的一個操作都可能影響到對方。

打個比方,如果我們透過cindyelf.raiseSalary()方法改變了salary域的值,那麼tobby透過getSalary()方法得到的就是修改之後的salary域的值,顯然這不是我們願意看到的。我們希望得到tobby的一個精確拷貝,同時兩者互不影響,這時候我們就可以使用Clone來滿足我們的需求。

Employee cindy=tobby.clone(),這時會產生一個新的Employee對象,並且和tobby有相同的屬性值和方法。

      2. Shallow Clone&Deep Clone

Clone是如何完成的呢? Object在對某個物件實作Clone時對其是一無所知的,它只是簡單地執行網域對網域的copy,這就是Shallow Clone。

這樣,問題就來了咯,以Employee為例,它裡面有一個域hireDay不是基本型別的變數,而是一個reference變量,經過Clone之後就會產生一個新的Date類型的reference,它和原始對像中對應的域指向同一個Date對象,這樣克隆類就和原始類共享了一部分信息,而這樣顯然是不利的,過程下圖中所示:

 這個時候我們就需要進行deep Clone了,對那些非基本型別的領域進行特殊的處理,例如本例中的hireDay。我們可以重新定義Clone方法,對hireDay做特殊處理,如下程式碼所示:

 class Employee implements Cloneable 
{ 
  public Object clone() throws CloneNotSupportedException 
  { 
   Employee cloned = (Employee) super.clone(); 
  cloned.hireDay = (Date) hireDay.clone() 
  return cloned; 
  } 
}

#3. Clone()方法的保護機制

在Object中Clone()是被申明為protected的,這樣做是有一定的道理的,以Employee

類別為例,透過申明為protected,就可以保證只有Employee類別裡面才能「複製」Employee對象,原理可以參考我前面關於public、protected、private的學習筆記。

4. Clone()方法的使用

Clone()方法的使用比較簡單,注意如下幾點即可:

a. 什麼時候使用shallow Clone,什麼時候使用deep Clone,這個主要看具體物件的域是什麼性質的,基本型別還是reference variable

b. 呼叫Clone()方法的物件所屬的類別(Class)必須implements Clonable介面,否則在呼叫Clone方法的時候會拋出CloneNotSupportedException。

以上是簡述Java中淺克隆與深度克隆所要涉及的clone()方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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