java中clone的用法

如果我們要用對象a2保存a1對象的數據,但又不希望a2對象數據被改變時不影響到a1。實現clone()方法是其一種最簡單,也是最高效的手段。 

clone

protected Object clone()
                throws CloneNotSupportedException
創建並返回此對象的一個副本。“副本”的準確含義可能依賴於對象的類。這樣做的目的是,對於任何對象 x,表達式:
x.clone() != x
爲 true,說明他們不是一個對象。表達式:
x.clone().getClass() == x.getClass()
也爲 true,說明他們是一個類型的class。但這些並非必須要滿足的要求。一般情況下:
x.clone().equals(x)
true,說明邏輯上應該相當。但這並非必須要滿足的要求。

按照慣例,返回的對象應該通過調用 super.clone 獲得。如果一個類及其所有的超類(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()

按照慣例,此方法返回的對象應該獨立於該對象(正被複制的對象)。要獲得此獨立性,在 super.clone 返回對象之前,有必要對該對象的一個或多個字段進行修改。這通常意味着要複製包含正在被複制對象的內部“深層結構”的所有可變對象,並使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或對不變對象的引用,那麼通常不需要修改 super.clone 返回的對象中的字段。

Object 類的 clone 方法執行特定的複製操作。首先,如果此對象的類不能實現接口 Cloneable,則會拋出 CloneNotSupportedException。注意,所有的數組都被視爲實現接口 Cloneable。否則,此方法會創建此對象的類的一個新實例,並像通過分配那樣,嚴格使用此對象相應字段的內容初始化該對象的所有字段;這些字段的內容沒有被自我複製。所以,此方法執行的是該對象的“淺表複製”,而不“深層複製”操作。

Object 類本身不實現接口 Cloneable,所以在類爲 Object 的對象上調用 clone 方法將會導致在運行時拋出異常。

返回:
此實例的一個副本。
拋出:
CloneNotSupportedException - 如果對象的類不支持 Cloneable 接口,則重寫 clone 方法的子類也會拋出此異常,以指示無法複製某個實例。
另請參見:
Cloneable
淺談淺複製和深複製

object 中默認的是淺複製,如果需要實現深複製,則必須對類中的可變區域生成新的實例。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章