本篇故事:愛未未在逃亡的過程中,見證到太多無辜的女人被汙衊為魔女而遭到殺害,這一切逼使著她投入黑暗,於是暗黑愛未未出現了! 她要復仇!
這一篇要練習的覆寫和隱藏父類別的方法,前陣子很紅的廣告詞:開局就送魔關羽!有魔關羽就有一般的關羽,他們一定極為相似,魔關羽繼承了關羽的大部份屬性,也一定有所不同,魔關羽的技能可能更帶有邪氣!
本篇我所做的就是使者與暗黑使者兩個類別,其中暗黑使者類別繼承了使者類別,同時修改(隱藏或覆寫)了它所繼承的方法,只要子類別內的方法和父類別內的方法同名、同參數列、同回傳值形態,就會修改!之所以要都相同,理由之一是因為 JAVA 還有一個功能叫過載,即使方法名稱相同,只要傳入的參數不同,JAVA 會自動選擇適合的方法。過戴會在本篇最下方再介紹一次。
父類別:
/* 使者類別 */
// 編寫人:Lancelot Cheng
public class Envoy {
public String name, brithday, blood;
public String profession, weapon;
public int level, exp, oID;
//private Contract envoyDemon;
// 建構子
public Envoy (int oID, String nn, String bD, String bb,
String pro, int lev, int ex, String wea) {
name = nn;
brithday = bD;
blood = bb;
this.oID = oID;
profession = pro;
level = lev;
exp = ex;
weapon = wea;
}
public static void surrender(){
System.out.println("投降");
}
public void normalattack () {
System.out.println( weapon + "一般攻擊!");
}
}
子類別:注意這裡有兩個方法的名稱與父類別相同,同內容不同,此即為修改。
/* 暗黑使者類別 */
// 編寫人:Lancelot Cheng
public class DarkEnvoy extends Envoy{
public DarkEnvoy(int oID, String nn, String bD, String bb
, String pro, int lev, int ex, String wea) {
super(oID, nn, bD, bb, pro, lev, ex, wea);
}
public static void surrender(){ // 與父類別同名:隱藏
System.out.println("自爆!");
}
public void attack () { // 與父類別同名:覆寫
System.out.println(weapon + "暗黑屬性攻擊!");
}
}
主程式:創造了一個愛未未使者和暗黑愛未未使者,都用它們的方法。
/* 主程式 */
// 編寫人:Lancelot Cheng
public class Main {
public static void main( String[] args){
// 創造一個愛未未使者物件。
Envoy ai = new Envoy( 0, "愛未未", "0712", "AB",
"魔術師", 10, 200, "撲克牌");
System.out.print("愛未未攻擊:");
ai.normalattack();
System.out.print("愛未未投降:");
ai.surrender();
System.out.println();
// 創造一個暗黑愛未未使者物件。
DarkEnvoy darkAi = new DarkEnvoy(0, "愛未未", "0712", "AB",
"魔術師", 10, 200, "撲克牌");
System.out.print("暗黑愛未未攻擊:");
darkAi.attack();
System.out.print("暗黑愛未未投降:");
darkAi.surrender();
}
}
結果:兩個物件的方法名稱相同,但結果不同,意思是子類別內的方法的確修改了。
愛未未攻擊:撲克牌一般攻擊!
愛未未投降:投降
暗黑愛未未攻擊:撲克牌暗黑屬性攻擊!
暗黑愛未未投降:自爆!
Process finished with exit code 0
這個練習滿簡單的,但不是一個好的寫法,我認為最好的寫法是使者類別與暗黑使者類別有共同的父類別,因為最好物件都是由子類產生,原因是子類別只能繼承到父類別中公開的變數,於是裡面所有的變數都必須設為公開,造成的結果是父類別所產生的物件,其成員可以被任意讀取與更動。都是修改方法,為什麼一個叫隱藏一個叫覆寫,我不知道原因。
關於過載,在同一個類別中,定義同名的方法,當你在使用該類別產生的物件之方法時, JAVA 可以以你輸入的參數類型、數量判斷要用哪一個方法。舉個應用的例子,我們要計算三角形面積,依照所拿到的條件是邊長、邊長、邊長或角度、邊長、角度還是邊長、角度、邊長,會用使用不同的方法,但這些方法的目的都相同,就是算出面積,對我們來說,因為方法不同而去記憶不同的方法名字很麻煩,所以名字都取一樣,讓 JAVA 依輸入參數屬性幫我們判斷使用哪個方法就好,這就是過載。其中輸入的參數也可以是我們自己定義的物件。在這邊的算三角形面積例子有點不太好,因為角度、邊長都可以是浮點數。
之後會再介紹介面與抽象類別,期待下一次的惡魔使者愛未未。
沒有留言:
張貼留言