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)