2010-07-02 105 views
1

如果我說在其他包中訪問受保護的方法?

class A{ 
} 

然後它含蓄地繼承對象class.So我有如下類別:

class A{ 

     protected Object clone(){ 
     } /// Here i am not overridning 
     //All the other methods (toString/wait/notify/notifyAll/getClass) 
} 

現在爲什麼不能我訪問B類的clone()方法是在相同的A類包中。

Class B{ 
     A a = new A(); 
     a.clone(); 
     ** 
} 

// **說明clone在Object類中是受保護的。但是我沒有訪問Object的克隆方法。在這裏我調用了A類的克隆方法,但是我還沒有重載。

+2

你的片段是誤導性的非常相同的錯誤。 類A {} 和 類A { 保護的克隆(){}} 是不等價的。在第一種情況下,當您在代碼段2中執行時,您不會實現克隆方法。您調用的錯誤不會與代碼段2一起顯示。 – dodecaplex 2010-07-02 09:23:39

+0

它不會回答您的問題,但在新API中優先選擇靜態工廠方法或將構造函數複製到克隆()。 – helpermethod 2010-07-02 09:47:31

+0

什麼意思你評論'///我在這裏沒有overridning'?你怎麼沒有壓倒它?在Object中,'clone'方法與'A.clone'具有完全相同的簽名,所以它重寫它。 – 2010-07-02 09:51:37

回答

3

protected方法在java.lang.Object中定義,因此您不能從其他包調用它 - 只能從子類調用它。

您稱之爲A,但它是java.lang.Object的方法,直到您覆蓋它爲止。

當重寫clone()時,應該將修飾符更改爲public並實施Cloneable。但是使用clone()方法不是一個好主意,因爲它很難正確實現。使用commons-beanutils來製作淺層克隆。

確保您區分「覆蓋」和「超載」。

+0

@Bozho:正如我所評論的,我不是重寫克隆方法。但爲什麼我無法從類B訪問該方法? – JavaUser 2010-07-02 09:04:33

+0

@JavaUser - 你肯定會在'A'中壓倒它! – Bozho 2010-07-02 09:06:54

+0

@Bozho:不,我不是重寫。我說從Object繼承的隱含意義。 – JavaUser 2010-07-02 09:09:48

1

這很好地工作

class A{ 

     protected Object clone(){ 
      return this; 
     } 
} 

public class B{ 
     public B() { 
      A a = new A(); 
      a.clone(); 
      System.out.println("success"); 
     } 
     public static void main(String[] args) { 
     new B(); 
    } 

} 
+0

正如我註釋到的,我不是重寫克隆方法。請從上面的代碼中移除克隆方法並編譯代碼。 – JavaUser 2010-07-02 09:07:24

+1

@JavaUser:在你的問題中不清楚,所以你的A對象中沒有受保護的clone(),它保持爲Object保護的方法,因此不能在java.lang包之外調用 – 2010-07-02 09:23:52

-1

如果不重新定義A用克隆方法,那麼,不要驚訝,如果你確實調用對象的clone()方法,而不是一個公司。

你得到

class A {} 

class B { 
    A a = new A(); 

    public B() { 
    A x = (A) ((Object) a).clone(); 
    } 
}