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;

   }

}

 

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 {

 

   public static void main(String[] args) {

      Character mike = new SwordsMan();

      //把類別改為Character,輸出也是一樣的效果

      //因為下面使用的本來就是父類別的方法,若要使用自己類別類的方法則再強制轉型即可

      //上面這一段表示:生成一個SwordsMan()的物件,但是貼上的標籤(變數)mike是一個Character

      //類似生成一個男人的物件(產生一個實體男人=SwordsMan),但是只說他是人類(Character)中的mike,沒有說他是男人

      //(所以java指認為他是人類(Character),但不清楚他是男人(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());

      SwordsMan mike2 = (SwordsMan) mike;

      //上面在強制轉型,告訴電腦我知道mike只是一個人類(Character),不一定是男人(SwordsMan)

      //但我現在要他「扮演」(=CAST=強制轉型)成一個男人(SwordsMan),並使用mike2做為他身為男人的標籤

      mike2.fight();

      //mike.cure();

      //mike是一個人類,但不一定是女人(Magician),所以上面這一行並不成立,人類(父類)無法使用特定人類(子類)的方法

      System.out.println("-------------");

     

      Character tim = new Magician();

      //把類別改為Character,輸出也是一樣的效果

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

     

      Character TEST = new Magician();

      SwordsMan TEST2 = (SwordsMan) TEST;

      //TEST明明是一個女人(Magician()),但是因為現在電腦只知道他是人類

//    我就可以強制轉型成(叫他扮演)男人(SwordsMan),這樣語法是可以通過的,因為對JAVA來說我只是強制把一個人類的標籤(TEST)轉成他的子類男人(TEST2)

      TEST2.fight();

      //實際執行時會出現"扮演"錯誤:java.lang.ClassCastException:

      //即使兩個類別都有fight這個方法,但他會發現由標籤TEST2()去找實際實體TEST()時,兩者不一致

     

 

   }

 

}


回傳結果

Name=Mike
Blood=100
level=0
SwordsMan fight
-------------
Name=Tim
Blood=80
level=0
-------------
Exception in thread "main" java.lang.ClassCastException: tw.xxx.myselfpractice.polymorphism.Magician cannot be cast to tw.xxx.myselfpractice.polymorphism.SwordsMan
    at tw.xxx.myselfpractice.polymorphism.PolymorphismEx1.main(PolymorphismEx1.java:79)

 

arrow
arrow
    全站熱搜

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