2013-05-04 107 views
0

我到處讀到如果我在不實現Cloneable接口的情況下調用clone(),我將得到CloneNotSupportedException。如果我在沒有實現Cloneable的類中實現clone方法,我仍然可以調用clone()w/o異常。我的意思是實施Cloneable沒有區別。請詳細說明........是否需要使用Clonable?

+0

您可能會發現[this read](http://www.javapractices.com/topic/TopicAction.do?Id=71)有趣。 – m0skit0 2013-05-04 18:22:54

+1

問題基於錯誤的前提。 – EJP 2013-05-04 18:31:05

+0

[爲了實現可克隆接口而克隆對象](http://stackoverflow.com/questions/8192223/object-cloning-with-out-implementing-cloneable-interface) – jlordo 2013-05-04 22:10:43

回答

4

實現Cloneable接口只是告訴程序員這個對象應該有一個有效的克隆方法。

如果你看了Cloneable接口,你會發現一個評論,看起來像這樣

注意這個接口不含有克隆 方法。因此,僅僅通過實現這個接口的事實來克隆一個對象是不可能的。即使 克隆方法是反射性調用,但不能保證它會成功。

可複製的接口只是程序員添加實現進行克隆時應該遵循的編程實踐。

-2

您的類已從Object繼承受保護的方法clone()(並且它能夠創建對象的淺表副本)。但是,爲了在您的類的定義之外訪問該方法,您需要將您的類標記爲「可複製」,即實現。

在你給出的例子中,如果你創建了一個和clone()具有相同簽名的方法,實現Cloneable對編譯器根本無關緊要,因爲他可以訪問你請求的方法,所以Cloneable的實現將僅僅是經驗性的。但是,我建議你堅持良好的實踐方法。

+0

「,以便獲得對該方法的訪問權限在您的類的定義之外,您需要將您的類標記爲Cloneable「否。對您的方法的訪問僅取決於您應用於方法的訪問說明符。實現'Cloneable'完全與它無關。 – newacct 2013-05-04 22:28:41

+0

如果你已經在你的類中定義了clone(),你所說的絕對正確。但是,如果您沒有實現Cloneable,您也不會覆蓋該方法,您無法在外部訪問它,因爲它隱含地受到保護。舉個例子:public class A {}。你可以從裏面調用clone,但是當你有一個實例時(例如A a = new A(); a.clone() - >這將不起作用;但是public class A {public void test(){this .clone()}}將)。也許我沒有解釋我的意思。請原諒我生疏的英語。另外,如果我不明白你的意思,我可以進一步解釋 – 2013-05-04 22:32:31

+0

你可以實現一個公共'clone()'方法,而不是實現'Cloneable'。該方法將被訪問,因爲你已經實現了它。相反,你不能實現一個公共'clone()'方法並實現'Cloneable'。該方法不會在課堂外訪問,因爲您沒有實現它。實現'Cloneable'是無關緊要的。 – newacct 2013-05-04 22:34:25

3

我到處讀到如果我在不實現Cloneable接口的情況下調用clone(),我將得到CloneNotSupportedException。

正確的,如果我們在談論Object.clone()。

如果我在一個沒有實現Cloneable的類中實現clone方法,我仍然可以調用clone()w/o異常。

不,你不能,如果我們在談論Object.clone()。

我的意思是實施Cloneable沒有區別。

是的。可能你的類繼承自一個已經實現了Cloneable的類。沒有看到任何代碼,就不可能知道你是如何抵達這種誤解的。

請詳細說明。

沒有什麼可說明的。你錯了。而已。

+0

這是一個沒有實現Cloneable的類的例子,它在不拋出異常的情況下調用它。公共類克隆器公共類克隆器(){ }返回新的克隆器(); } public static void main(String [] args){ (new Cloneer())。clone(); } }' – FDinoff 2013-05-04 18:51:45

+0

這是一個不調用Object.clone()的類的示例,因此沒有爲Object.clone()指定的副作用適用於它,包括NotCloneableException。我建議你閱讀Javadoc。不是一個真正的問題。 – EJP 2013-05-04 19:11:57

+0

也許你應該解釋一下你認爲的混亂是什麼? – FDinoff 2013-05-04 19:18:01

相關問題