[英]Accessing clone() from java.lang.Object
這是我無法理解的。
在java.lang.Object
, clone()
是使用protected
modifier定義的。 根據定義,它可以通過名稱在其自己的類定義中訪問,通過名稱在從它派生的任何類中,並通過名稱在同一個包中的任何類的定義中。
這里的Sample
類在另一個包中,顯然它不能從Object
類訪問clone()
。 但是,當Sample
從Object
隱式派生時,為什么它無法訪問它? 該定義並未說明它必須滿足兩個條件(在同一個包內並且也是一個子類)。
public class Sample {
public Object foo() throws CloneNotSupportedException {
...
return someObject.clone();
}
}
在您的情況下, clone()
方法不可見,因為您沒有從子類中調用它。 Sample
派生自Object
,因此它可以訪問自己的clone()
方法,但不能訪問其他對象。
對象clone()
設計有幾個錯誤。 所以使用它並不是一個好習慣 - 很難做到正確:
clone()
使它公開,它仍然會失敗,因為每個類都必須實現Cloneable
Cloneable
沒有定義任何方法,因此對象的用戶不能將其稱為Cloneable
並期望克隆方法。 super.clone()
才能使默認克隆機制起作用 檢查這個問題的替代品。
適合我: http : //ideone.com/eST8Y
import java.util.*;
import java.lang.*;
class Main
{
public Object foo() throws CloneNotSupportedException
{
return this.clone();
}
public static void main (String[] args) throws java.lang.Exception
{
new Main().foo();
}
}
這編譯沒有錯誤。 它仍會拋出運行時CloneNotSupportedException
因為Main
不實現Cloneable
。
類實現了
Cloneable
接口,以向Object.clone()
方法指示該方法合法地為該類的實例制作字段的字段副本。在未實現
Cloneable
接口的實例上調用Object的clone方法會導致拋出異常CloneNotSupportedException
。
不過,@ Bozho的答案確實是正確的答案。 只是不要使用Object.clone()
。
請參閱Effective Java ,第10項:明智地覆蓋clone
(稍后版本中的第11項)。
someObject
的類類型在這里很重要。 Object someObject
可能沒有覆蓋Object
類的clone()
方法,因此對類Sample
不可見。
你是什么意思“無法訪問它”? 你的意思是它不會編譯,或者你的意思是它拋出CloneNotSupportedException。
如果您的類沒有實現Cloneable接口, Object.clone()
將拋出CloneNotSupportedException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.