public 權限修飾


封裝物件內部資料CashCard類別是定義在cc.openhome套件中,假設現在為了管理上的需求,你要將CashCard類別定義至cc.openhome.virtual套件中,除了原始碼與位元碼的資料夾需求必須符合套件階層之外,原始碼內容也得作些修改:

package cc.openhome.virtual;
class CashCard {
    ...
}

這一改可不得了,你發現使用到CashCard的程式碼都出錯了:

CashCard不是公開的?


宣告為private的成員表示為類別私有,使用者無法在其它類別的程式碼中直接存取。如果沒有宣告權限修飾的成員,只有在相同套件的類別程式碼中,才可以直接存取,也就是「套件範圍權限」。如果不同套件的類別程式碼中,想要直接存取,就會出現上圖的錯誤訊息。

如果想在其它套件的類別程式碼中存取某套件的類別或物件成員,則該類別或物件成員必須是公開成員,在Java中要使用public加以宣告。例如:

package cc.openhome.virtual;

public class CashCard {
    ...略

    public CashCard(String number, int balance, int bonus) {
        ...略
    }
    
    public void store(int money) {
        ...略
    }
    
    public void charge(int money) {
        ...略
    }
    
    public int exchange(int bonus) {
        ...略
    }

    public int getBalance() {
        return balance;
    }

    public int getBonus() {
        return bonus;
    }

    public String getNumber() {
        return number;
    }
}

你可以宣告類別為public,這表示它是個公開類別,可以在其它套件的類別中使用,你可以在建構式上宣告public,這表示其它套件中的類別可以直接呼叫這個建構式,你可以在方法上宣告public,這表示其它套件的方法可以直接呼叫這個方法。如果你願意,也可以在物件資料成員上宣告public


回憶一下 使用 package 管理類別 提過,套件管理其實還有權限管理上的概念,沒有定義任何權限關鍵字時,就是套件權限,在Java中其實有privateprotectedpublic三個權限修飾,你已經認識privatepublic的使用了,protected則會在繼承時說明。

如果類別上沒有宣告public權限關鍵字,類別中的方法宣告就算是public,也等於是套件權限了,因為類別本身是套件權限,其它套件根本就無法使用類別了,更別說當中定義的方法。