package tw.xxx.myselfpractice.polymorphism;

 

class  Character{

   private String name;

   private int blood;

   private 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(){

      //只寫名稱,不想方法,方法讓下面的子類別自己定義

   }

}

 

class Magician extends Character{

   public void fight(){

      System.out.println("Magician fight");

   }

  

   public void cure(){

      System.out.println("MAGIC cure");

   }

  

}

 

class SwordsMan extends Character{

   public void fight(){

      System.out.println("SwordsMan fight");

   }

}

 

 

 

public class PolymorphismEx1 {

  

   static void showBlood(Character character){

      System.out.println("角色血量為="+character.getBlood());

   }

   //因為下面miketim都是設定成Character分類,所以都可以直接呼叫執行此方法

   //可以透過父類別的形態來操作子類別的物件,此即為多形

  

   static void drawFight(Character character){//******宣告為父類別(Character)型態

      character.fight();

      //↑若父類別未定義時,不可以直接呼叫.fight(),因為即使子類別有,但是在父類別(Character)找不到,java只會往上找,不會往下找

      //但如果在父類別有時,因為實作的是子類別,所以會從子類別開始找()

      //舉例來說,子類別中的女人(實例)跟男人(實例)都會唱歌,但是你只標記他們是人類,所以JAVA只知道這邊有兩個人類,而人類的定義中並未說他會唱歌(沒有唱歌這個方法)

      //所以當你要求JAVA叫人類這個實例唱歌時會出現錯誤,因為他不確定人類會唱歌

      //但是如果你把唱歌加入人類時,他就知道人類會唱歌了,就會可以通過

      //而在執行時因為是男人(或女人)在做,那他們就會用自己的方式唱歌,也就是子類別覆載(override)父類別的同名項目(方法、變數)

      //另外雖然輸入的參數類別定義為Character(人類),但是由於只要是父類別底下的子類別必定有繼承父類別的一切,所以也可以將子類別直接術入此方法中

 

   }

  

   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("-------------");

     

     

     

      showBlood(mike);

      showBlood(tim);

     

      drawFight(mike);//******實際操作是子類別

      drawFight(tim);

      //因為父類別有,所以子類別可以直接用

      //雖然輸入的類別定義為Character(人類),但是由於只要是父類別底下的子類別必定有繼承父類別的一切,所以也可以將子類別直接術入此方法中

      //注意mike的標籤是SwordsMantim的標籤是Character,但都可以使用此方法

      //可是如果父類別沒有fight時,則drawFight中會無法寫下.fight()

      //如果傳入drawFight()的是子類別,父類別參數參考的就直接是子類別的實作(mike)了,所以操作的就是子類別上的方法定義

      //可以說實例mike身上掛了兩個類別標籤:CharacterSwordsMan(或說他掛了SwordsManSwordsMan又掛了Character)

     

     

 

   }

 

}


Name=Mike
Blood=100
level=0
-------------
Name=Tim
Blood=80
level=0
-------------
角色血量為=100
角色血量為=80
SwordsMan fight
Magician fight

arrow
arrow
    全站熱搜

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