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());
}
//因為下面mike和tim都是設定成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的標籤是SwordsMan,tim的標籤是Character,但都可以使用此方法
//可是如果父類別沒有fight時,則drawFight中會無法寫下.fight()
//如果傳入drawFight()的是子類別,父類別參數參考的就直接是子類別的實作(mike)了,所以操作的就是子類別上的方法定義
//可以說實例mike身上掛了兩個類別標籤:Character、SwordsMan(或說他掛了SwordsMan,SwordsMan又掛了Character)
}
}
Name=Mike
Blood=100
level=0
-------------
Name=Tim
Blood=80
level=0
-------------
角色血量為=100
角色血量為=80
SwordsMan fight
Magician fight