2011-07-18 47 views
32

我正在閱讀一些Java文本,文字說我們只能對類和接口應用publicdefault訪問修飾符。因此,它是一個編譯錯誤,如果我們聲明:爲什麼類或接口不能接收私有或受保護的訪問修飾符?

private class A {} 

protected class A{} 

我只是好奇,爲什麼一個類或接口無法接收privateprotected訪問修飾符?

+0

這是不是如果我們聲明私有類A {}或保護B類{一個編譯錯誤}只要因爲A和B不是頂級類。 – emory

+0

我相信接口的默認訪問是公共的,所以實際上接口總是公共的。 –

+1

@Adriaan Koster No.該規則適用*內*接口,但不適用於接口本身。 – EJP

回答

53

private表示「僅在封閉類中可見」。

protected表示「僅在封閉類和任何子類中以及封閉類包中的任何位置可見」。

private因此,應用於頂級類時沒有意義; protected定義的第一部分也是如此。 protected的第二部分可以應用,但它由默認(軟件包保護)修飾符覆蓋,因此protected是部分無意義且部分冗餘的。

privateprotected都可以(並經常)應用於嵌套類和接口,而不是頂級類和接口。

5

頂級的類可見性只有兩個用例(a)隨處可見(b)僅在包中可見。因此只有兩個修飾符(public和默認值)。如果班級是public,那麼它對所有班級都是可見的。如果沒有訪問修飾符,則僅對同一包中的類纔可見。

如果頂級的類可見性有更多的用例,Java語言會提供更多的修飾符。

+0

首先,Java提供的可視性比Java提供的要多(例如參見c#),其次你可以使用受保護或私有修飾符的類 - 只是沒有頂級修飾符。 – Voo

+0

@Voo,頂層只有兩個用例。我相信問題暗示,正如它所說的任何其他修飾符給編譯錯誤 –

+0

類的可見性意味着什麼? –

15

頂級類只能有publicdefault訪問,但內部類可以有private access

public class TestClassAccess 
{ 
    public static void main(String[] args) 
    { 
     new TestClassAccess().new TestClassPrivateAccess(); 
    } 

    private class TestClassPrivateAccess 
    { 
     TestClassPrivateAccess() 
     { 
      System.out.println("I'm a private class"); 
     } 
    } 
} 
+3

很好的例子。內部類也可以是靜態的。內部接口和枚舉是隱式靜態的。 – emory

相關問題