本篇參考
良葛格-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
沒有留言:
張貼留言