//抽象類別是一種框架、條件限制,規定繼承者必須要覆寫(自定義)這個方法

//例如一張衣服設計圖的架構,只規定你設計一件衣服須要有「顏色,大小」,至於顏色跟大小分別是多少則不規定

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()方法,因為MagicianCharacter的員工(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)

arrow
arrow
    全站熱搜

    乙方 發表在 痞客邦 留言(0) 人氣()