package 與存取修飾


在Java 語法中,有三個存取修飾:public、protected與private。但事實上,有四個權限範圍。

如果你在宣告類別時沒有加上任何存取修飾, 則預設為package存取範圍,該類別僅限於同一個package下的成員所使用。如果宣告類別成員(資料成員或方法成員)時沒有加上任何存取修飾,則 預設為package存取範圍,該類別成員僅限於同一個package下的成員所使用。

如果在宣告類別成員時,其存取修飾超過類別存取修飾,則類 別成員的存取類別修飾受到約束,也就是以類別上的存取 修飾為類別成員的存取修飾。例如:
class Some {
    public int data;
}

在這個程式碼中,Some類別為package存取範圍,而data宣告為public存取範圍,則最後data受到Some的約束,為package存 取範圍。

被private修飾之成員,僅限類別內部 使用,無論是子類別、任何外部類別,都不準直接存取。

被protected修飾之成員,則限同一 package成員直接存取,其它package的成員,必須透過繼承的方式,才可以在子類別中存取該成員。

被public修飾之成員,可以被所有成員 存取,為最廣之存取範圍。

下表為四個存取權限與package之間的關係,OK表示該範圍中的成員可以存取:
存取修飾 同一類別 同一套件 不同套件的子類別 不同套件的非子類別
private OK


default OK OK

protected OK OK OK
public OK OK OK OK

如果定義類別時,沒有設定package,並非沒有package,而是設定為default package。default package無法import

回憶一下 使用 import 少打幾個字 中說過:當編譯器看到一個沒有package名稱的類別名稱,會先在同一個套件範 圍下尋找類 別,如果找到就使用,如果沒找到,再試著從import陳述的部份比別。依 此說明,由於default package中的類別無法import,就等於限制default package下的類別只能為default package下的成員所使用。不建議使用defult package,應該用package將類別分門別類加以置放。