如果我們要用對象a2保存a1對象的數據,但又不希望a2對象數據被改變時不影響到a1。實現clone()方法是其一種最簡單,也是最高效的手段。
clone
protected Object clone() throws CloneNotSupportedException
- 創建並返回此對象的一個副本。“副本”的準確含義可能依賴於對象的類。這樣做的目的是,對於任何對象 x,表達式:
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
按照慣例,返回的對象應該通過調用 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 中默認的是淺複製,如果需要實現深複製,則必須對類中的可變區域生成新的實例。