2008-12-02 55 views
3

在java中,有三種訪問級別:的Java保護訪問不工作

  • 公共 - 向世界開放
  • 私人 - 只開放給類
  • 保護 - 只開放給班級和它的子類(繼承)。

那麼爲什麼java編譯器允許這種情況發生?

TestBlah.java:

public class TestBlah { 

    public static void main(String[] args) { 
     Blah a = new Blah("Blah"); 
     Bloo b = new Bloo("Bloo"); 
     System.out.println(a.getMessage()); 
     System.out.println(b.getMessage()); //Works 
     System.out.println(a.testing); 
     System.out.println(b.testing); //Works 
    } 
} 

Blah.java:

public class Blah { 
    protected String message; 

    public Blah(String msg) { 
     this.message = msg; 
    } 

    protected String getMessage(){ 
     return(this.message); 
    } 
} 

Bloo.java:

public class Bloo extends Blah { 
    public Bloo(String testing) { 
     super(testing); 
    } 
} 
+1

還有包訪問。這是沒有修飾符的默認值。 – jjnguy 2008-12-02 03:19:33

+0

你確定沒錯 - a.testing和b.testing沒有聲明。 你是指a.message和b.message? – 2008-12-02 03:19:49

回答

10

由於保護裝置的子類或其他類在同一包。

實際上有第四個「默認」訪問級別,當省略修飾符時,可以訪問同一包中的其他類。

因此protected是在默認和public之間的訪問。

3

你能叫b.getMessage()因爲b是類型Bloo,其延伸Blah,並且getMessage()受到保護。正如你所提到的,受保護的,允許子類訪問該方法。

你已經得到了下面的錯誤,但:

  • Bloo構造函數調用super()不帶參數是一個錯誤。編譯器找不到無參數Blah構造函數,因爲您使用String參數定義了一個構造函數。
  • 調用new Blah() in TestBlahmain由於與上述相同的原因,方法是錯誤的。
  • 參考a.testingb.testing是錯誤的,因爲您沒有爲任何類定義變量testing
5

更具體地說,您希望protected像在C++中一樣工作。

但是,在Java中,它有不同的含義。在Java中,受保護的方法可用於該類(顯然),同一包中的所有其他類以及此類的任何子類。除非他們繼承這個原始類,否則其他包中的類將無法訪問。

See this similar question瞭解更多有關遺傳標記的信息。我個人幾乎從不使用protected。我開發應用程序而不是框架,所以我更可能定義public方法,private數據,並且經常將我的整個班級標記爲final

5

實際上有四個訪問級別:「public」,「protected」,「private」&默認也被稱爲包私有或包保護。默認限制包的可訪問性。默認是非常有用的,我經常使用它。