2009-07-01 201 views
15

可複製的接口和object.clone()如果我有:混淆在Java

class foo implements Cloneable 

然後執行:

bar = new foo(); 
bar.clone(); 

我得到一個淺拷貝,而無需編寫任何代碼bar.clone()像當我實現一個接口時,我通常需要這樣做。

我的理解是,一個接口的功能,必須通過實現它的類被填滿,Object.clone()沒有執行(按照文檔「Object類本身不實現接口Cloneable」)

所以我的淺層克隆從哪裏來?代碼如果Object.clone()沒有實現,代碼在哪裏?我很困惑。

+0

我鼓勵你接受一個答案或要求更多的澄清,以便我們能夠得到正確的答案:-)。 – Tom 2010-12-29 04:13:57

+0

@Tom sure thing :) – ambertch 2011-01-03 22:51:04

回答

27

非常小心使用克隆。事實上,我會完全避免它。我有從來沒有需要它。但是......話說回來,關於我讀過的主題的最佳討論是Joshua Bloch在Effective Java中的討論。閱讀第11項:「明智地重寫克隆」。

請自己幫忙,並閱讀該項目。我實際上建議閱讀整章(以及本書的其餘部分)。你需要知道的關於克隆的一切,以及爲什麼我會告誡你。

希望這會有所幫助。

6

Object.clone()有一個實現:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()

此鏈接解釋了Cloneable接口: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html

的對象必須實現以撥打克隆Cloneable接口()方法,否則它會拋出CloneNotSupportedException異常。根據定義,Java中的所有類都擴展了Object Object類,而Object類有一個默認的clone()方法,即使Object自身沒有實現Cloneable。如果你沒有自己覆蓋它,Object類的clone()方法將被調用。

+0

啊我明白了。我誤讀了文檔 - 對象有clone()的代碼,它只是不實現可複製的 那麼爲了調用class.clone()而強制實現可複製實現的機制是什麼?這只是JRE意識到故意檢查的事情嗎? – ambertch 2009-07-01 05:38:30

+0

快速回答 - 沒有任何。該接口決定了Object的clone()實現的行爲。如果一個類是Cloneable,Object.clone()會返回一個副本,否則會拋出CloneNotSupportedException異常。 Cloneable接口本質上修改了其超類的clone()實現的行爲。 – Cambium 2009-07-01 05:54:11

1

如果我有: 「類Foo實現 可複製的,」

然後執行:巴=新富(); bar.clone();

我得到一個淺拷貝,而無需 編寫任何bar.clone()這樣的代碼我 通常會需要做的,當我 實現一個接口。

如果您在類「富」中調用它,因爲從Object繼承.clone()方法是受保護這隻會工作。

我的理解是,一個 接口的功能的,必須在課堂上充滿 實現它,並且 Object.clone()有沒有實現 (根據文檔,「Object類 本身不實施 接口Cloneable「)

(1)Object.clone()確實有一個實現。如果對象執行Cloneable,它會創建該對象的淺表副本。 (2).clone()方法不是任何接口的一部分。 (3)有一個.clone()方法和實現Cloneable接口是完全分開的東西。如果您打算使用Objectclone方法,則只需實現Cloneable接口;然而,這是爲您的班級編寫clone方法的推薦方式 - 從超類的clone方法中獲取它的副本,最終這種方法最高可達Objectclone方法。