package tw.xxx.myfirstproject.game;
class Character {
protected String name;
protected int blood;
protected int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public void fight(){
}
public String toString(){
return String.format("(%s,%d,%d)",this.name,this.level,this.blood);
}
public Character copy(){
return new Character();
}
//測試父子類別間的關係
}
class Magician extends Character {
public void fight(){
System.out.println("Magician fight");
}
public void cure() {
System.out.println("MAGIC cure");
}
public String toString(){
return "Magician"+super.toString();
//文字+呼叫父類別的toString(方法)回應
//因為父類別回應的類型也是字串所以可以自己連起來
//但不能呼叫父類別的private
//重新定義時,子類別的類型範圍只能比父類別大,不能比父類別小
//例如父類別的toString()若是proctected,兒子類別只能是public
}
@Override
public Magician copy(){
return new Magician();
}
//原本↑在JDK5之前因為輸入與回傳類別與父類別的不一樣,所以無法說他是@Override,在JDK5後,重新定義方法時如果返回的型態是父類別中方法(被覆載的那個方法)返回型態的子類別,則可以通過編譯
}
class SwordsMan extends Character {
public void fight() {
System.out.println("SwordsMan fight");
}
public String toString(){
return "SwordsMan"+super.toString();
}
}
public class GamePolymorphismEx1 {
static void showBlood(Character character) {
System.out.println("角色血量為=" + character.getBlood());
}
static void drawFight(Character character) {// ******宣告為父類別(Character)型態
character.fight();
}
public static void main(String[] args) {
SwordsMan mike = new SwordsMan();
mike.setName("Mike");
mike.setBlood(100);
mike.setLevel(0);
System.out.println("Name=" + mike.getName());
System.out.println("Blood=" + mike.getBlood());
System.out.println("level=" + mike.getLevel());
System.out.println("-------------");
Character tim = new Magician();
tim.setName("Tim");
tim.setBlood(80);
tim.setLevel(0);
System.out.println("Name=" + tim.getName());
System.out.println("Blood=" + tim.getBlood());
System.out.println("level=" + tim.getLevel());
System.out.println("-------------");
System.out.println(mike.toString());
System.out.println(tim);
//因為toString是預設,所以不用打也會出現,但是如果沒有覆寫toString,那就會出現記憶體地址
}
}