簡體   English   中英

從java.lang.Object訪問clone()

[英]Accessing clone() from java.lang.Object

這是我無法理解的。

java.lang.Objectclone()是使用protected modifier定義的。 根據定義,它可以通過名稱在其自己的類定義中訪問,通過名稱在從它派生的任何類中,並通過名稱在同一個包中的任何類的定義中。

這里的Sample類在另一個包中,顯然它不能從Object類訪問clone() 但是,當SampleObject隱式派生時,為什么它無法訪問它? 該定義並未說明它必須滿足兩個條件(在同一個包內並且也是一個子類)。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM