在一個類的內部,其成員(包括成員變量和成員函數)能否被其他類所訪問,取決於該成員的修飾詞。Java的類成員訪問權限修飾詞有四類:private,無(默認情況下),protected和public。其權限控制如下表所示:
修飾詞 | 本類 | 同一個包的類 | 繼承類 | 其他類 |
private | √ | × | × | × |
無(默認) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
其中,默認情況下沒有任何修飾詞,這樣的類成員具有“包訪問權”,即位於同一個包中的類對其有訪問權;而protected為“繼承訪問權”,即該類的子類對其具有訪問權(同時,位於同一個包中的類也對其具有訪問權)。
而對於Java中的“類”(不是其內部成員,兩者要區分開),其訪問權限修飾詞僅有public和“無”(即包訪問權)兩種,而沒有private和protected(有 一個特例,就是“內部類”,其可以是private或protected的)。所以對於類的訪問權限,你僅有兩個選擇:包訪問權或是public。如果你 不希望其他任何人對該類擁有訪問權,你可以把所有的構造器都指定為private,從而阻止任何人創建該類的對象。但是有一個例外,就是在該類的 static成員內部進行創建。如:
class Soup {
// private Constructor!
private Soup() {}
// Allow creation via static method:
public static Soup makeSoup() {
return new Soup();
}
}
另外,如果一個類的訪問權限為“包訪問權”,並且其內部有一個static的成員為public的話,則其他包中的類仍舊可以訪問該static成員,哪怕它們並不能生成該類的對象。