2012-07-26 74 views
1

是不是這個子類繼承了所有東西都是超類真?但子類無法訪問其超類的私有屬性/方法,但可以訪問它自己的。所以我寫了一個測試程序。但似乎子類沒有一個!私有成員沒有被Java中的子類繼承(或可以覆蓋)?

class a { 
    private void set() { 
      System.out.println("a.set()"); 
    } 
} 
public class b extends a { 
//  private void set() { 
//  System.out.pritln("b.set()"); 
//  } 
     void f() { 
      set(); 
     } 
     public static void main(String[] args) { 
      b b = new b(); 
      b.f(); 
     } 
} 

如果我註釋掉b中的set()方法,它將不會編譯。

有什麼想法? JVM視圖的任何解釋?

+1

它們是繼承的,但默認情況下不可訪問。如果你真的想,你可以利用一些技巧讓它們在運行時變得可訪問。 – aroth 2012-07-26 01:54:40

回答

4

是的,private方法不能從派生類訪問。 protectedpublic

當您在派生類中聲明set時,您可以訪問此派生版本,因爲它現在是類的一部分(不再是基類方法private)。

如果您嘗試致電super.set(),仍然會出現錯誤。

編輯:這個詭計正在談論我假設的是反思。 :) 別。

+1

+1反對通過重新感染避開訪問權限的建議 – akf 2012-07-26 01:58:01

+0

謝謝L.G. ,我知道super.set()無疑是無法訪問的(或無法訪問?Orz ...)。我感到困惑的是:因爲b繼承了a的所有內容,b有它自己的set(),所以它在f()中使用set(),這是理性的,對嗎?我想知道在JVM中正在做什麼...... – larmbr 2012-07-26 02:15:16

0

這個問題是沒有意義的。私人是私人的。當前課程以外的所有內容都不可見。如果你想'保護',使用它。

+1

私有是私有的......直到有人使用反射來查找Field並在其上調用setAccessible(true)。問題是這個字段是否是繼承的,它是,不管它是否真的可見。 – aroth 2012-07-26 01:56:15

+0

@aroth雖然公平起見,但我只看到在一些「黑客」中做過的事情;而不是在設計中:) – 2012-07-26 01:57:23

+0

@pst和單元測試。 – 2012-07-26 01:57:39

0

如果您想要介於兩者之間,請使用「受保護」修飾符而不是「私有」修飾符;基本上保護意味着除了子類以外的所有東西都是私有

+1

和相同的包。 – 2012-07-26 02:05:24