就之前的RPG遊戲來說,如果建立了一個角色,想顯示角色的細節,必須如下撰寫:
SwordsMan swordsMan = new SwordsMan();
...略
System.out.printf("劍士 (%s, %d, %d)%n", swordsMan.getName(),
swordsMan.getLevel(), swordsMan.getBlood());
Magician magician = new Magician();
...略
System.out.printf("魔法師 (%s, %d, %d)%n", magician.getName(),
magician.getLevel(), magician.getBlood());
這對使用SwordsMan
或Magician
的客戶端有點不方便,如果你可以在SwordsMan
或Magician
上定義個toString()
方法,傳回角色的字串描述:
public class SwordsMan extends Role {
...略
public String toString() {
return String.format("劍士 (%s, %d, %d)", this.getName(),
this.getLevel(), this.getBlood());
}
}
public class Magician extends Role {
...略
public String toString() {
return String.format("魔法師 (%s, %d, %d)", this.getName(),
this.getLevel(), this.getBlood());
}
}
客戶端就可以如下撰寫:
SwordsMan swordsMan = new SwordsMan();
...略
System.out.println(swordsMan.toString());
Magician magician = new Magician();
...略
System.out.printf(magician.toString());
看來客戶端簡潔許多。不過你定義的toString()
在取得名稱、等級與血量時不是很方便,因為Role
中的name
、level
與blood
被定義為private
,所以無法直接於子類別中存取,只能透過getName()
、getLevel()
、getBlood()
來取得。
將Role
中的name
、level
與blood
定義為public
?這又會完全開放name
、level
與blood
存取權限,你並不想這麼作,只想讓子類別可以直接存取name
、level
與blood
的話,可以定義它們為protected
:
package cc.openhome;
public abstract class Role {
protected String name;
protected int level;
protected int blood;
...略
}
被宣告為protected
的成員,相同套件中的類別可以直接存取,不同套件中的類別可以在繼承後的子類別直接存取。現在你的SwordsMan
可以如下定義toString()
:
package cc.openhome;
public class SwordsMan extends Role {
...略
public String toString() {
return String.format("劍士 (%s, %d, %d)", this.name,
this.level, this.blood);
}
}
Magician
也可以如下撰寫:
package cc.openhome;
public class Magician extends Role {
...略
public String toString() {
return String.format("魔法師 (%s, %d, %d)", this.name,
this.level, this.blood);
}
}
如果方法中沒有同名參數,this
可以省略,不過基於程式可讀性,多打個this
會比較清楚。
到這邊為止,Java中三個權限關鍵字你都看到了,也就是public
、protected
與private
,雖然只有三個權限關鍵字,但實際上四個權限範圍,因為沒有定義權限關鍵字,預設就是套件範圍,以下列表權限關鍵字與權限範圍的關係:
關鍵字 | 類別內部 | 相同套件類別 | 不同套件類別 |
public |
可存取 | 可存取 | 可存取 |
protected |
可存取 | 可存取 | 子類別可存取 |
無 | 可存取 | 可存取 | 不可存取 |
private |
可存取 | 不可存取 | 不可存取 |
簡單來說,依權限小至大來區分,就是private
、無關鍵字、protected
與public
,設計時要使用哪個權限,是依經驗或團隊討論而定,如果一開始不知道使用哪個權限,就先使用private
,日後視需求再放開權限。