//抽象類別是一種框架、條件限制,規定繼承者必須要覆寫(自定義)這個方法
//例如一張衣服設計圖的架構,只規定你設計一件衣服須要有「顏色,大小」,至於顏色跟大小分別是多少則不規定
package tw.tinachang.myfirstproject.game;
abstract class Character {
protected String name;
protected int blood;
protected int level;
//把以上資料從private改為protected
//protected可以供同package跟不同package但有繼承關係的子類別使用
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 abstract void fight();
// 抽象類別只寫方法名稱,不寫方法(後面是分號非括弧),方法讓下面的子類別自己定義
}
class Magician extends Character {
//必須有一個fight的方法實作,若不實作則可以讓fight也變成抽象方法,這樣的話此類別也需要是抽象類別
//abstract class Magician extends Character {←因為有fight這個抽象方法,所以類別也需要是抽象的
// public abstract void fight();←抽象方法分號結尾
// }
public void fight(){
System.out.println("Magician fight");
}
public void cure() {
System.out.println("MAGIC cure");
}
public String toString(){
return String.format("Magician (%s,%d,%d)",super.name,this.level,blood);
//因為父類別中的資料改為protected,所以子類別可以直接用this(或super,也可以直接寫變數名稱,因為目前沒有同名變數,他會自己往上抓)來抓取
}
//toString是一種JAVA預設的語法,非String型態的資料若是放入print中則會自動幫他加上toString
//但若是沒有覆寫toString,那麼只會列印出地址,不會是上面這行資料
}
class test extends Magician{
//不需要有fight()方法,因為Magician是Character的員工(abstract實作)(也是兒子),但test雖然是Magician的兒子卻不是Character的員工
}
class SwordsMan extends Character {
public void fight() {
System.out.println("SwordsMan fight");
}
public String toString(){
return String.format("SwordsMan (%s,%d,%d)", this.getName(),this.getLevel(),this.getBlood());
}
}
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,那就會出現記憶體地址
}
}
Name=Mike
Blood=100
level=0
-------------
Name=Tim
Blood=80
level=0
-------------
SwordsMan (Mike,0,100)
Magician (Tim,0,80)
留言列表