2016/5/8

protected:Java為例

本篇參考良葛格-protected 成員

拿之前RPG遊戲拿說,現在我們想顯示角色細節,要這樣寫:
1
2
3
4
SwordsMan swordsMan = new SwordsMan();
...System.out.printf("劍士 (%s, %d, %d)%n", swordsMan.getName(), 
swordsMan.getLevel(), swordsMan.getBlood());




這對於客戶端來說還不算方便,我們是不是可以把這些細節直接寫成一個方法呢?
客戶端呼叫就直接顯示細節,不用自己慢慢叫一個個參數自己排。
寫個toString()方法
1
2
3
4
5
6
7
public class SwordsMan extends Role {
    ...public String toString() {
        return String.format("劍士 (%s, %d, %d)", this.getName(), 
                this.getLevel(), this.getBlood());
    }
}

現在客戶端可以這樣寫:
1
2
3
4
5
6
SwordsMan swordsMan = new SwordsMan();
...System.out.println(swordsMan.toString());
Magician magician = new Magician();
...System.out.printf(magician.toString());
客戶端的確方便許多,但你在寫toString()時卻麻煩了一點,因為你要取得參數必須透過父類提供的方法才行,因安全性問題父類資料成員設為private,如果可以直接存取父類別的參數資料成員呢?可用protected
這樣你就不用public全開放權限,繼承父類的子類別就可存取父類的資料成員。
1
2
3
4
5
public abstract class Role {
    protected String name;
    protected int level;
    protected int blood;
..................
現在你toString()可直接這樣寫:
1
2
3
public String toString() {
    return String.format("劍士 (%s, %d, %d)", this.name,this.level, this.blood);
}

結論:加上protected修飾的資料成員,可讓子類別存取,不會像public那樣完全開放隨意存取,不會像private都不能存。

以下列表權限關鍵字與權限範圍的關係:
關鍵字類別內部相同套件類別不同套件類別
public可存取可存取可存取
protected可存取可存取子類別可存取
可存取可存取不可存取
private可存取不可存取不可存取
小到大排序:private、無關鍵字、protected與public

沒有留言:

張貼留言