2021年6月23日 星期三

JAVA 物件導向的概念-05 繼承,老鼠的兒子會打洞

   繼承是物件導向的核心之一,方式是把類別分為父類別和子類別,子類別繼承父類別,就會擁有父類別的屬性。你可能會問為什麼不寫成一個類別就好,理由是當你要寫很多不同的類別時,各自去寫會很累,而如果你要寫的類別有共同的屬性,你可以把這些共同屬性抽出來,寫成父類別,再只針對不同的屬性,各自寫成比較簡略的子類別去繼承父類別。這樣可以少寫很多程式碼!

  這一篇範例我要寫的是一般人、圓桌武士、皇室成員,這三種我可以各自寫出他們對應的類別,但也可以抽出其共同屬性,寫成父類別,而不同屬性部份再各自寫成子類別。他們的共同性就是都是人類,也都擁有他們的名字、生日、血型。於是我寫出以下父類別,其中還有展現基本資料的方法。

父類別:人類
/* 父類別:人類 */
// 編寫人:Lancelot Cheng
public class Human {
public String name, brithday, blood;
// 我發現父類別的變數要設 public 子類別才能繼承,不然就是要設 getter and setter 吧。

// 父類別的建構子
public Human(String name, String brithday, String blood){
this.name = name;
this.brithday = brithday;
this. blood =blood;
}

void showBasicallFile() {
System.out.println( "名字:" + name + ";生日:" + brithday + ";血型:" + blood);
}
}

子類別:圓桌武士,KinghtsRoundTable 後面的 extends Human 就是繼承 Human 類別的意思,可以視作除了父類別的建構子,父類別裡的程式碼這裡都有一份。使用父類別的建構子,要使用 super 指令。
/* 子類別:圓桌武士(kinghts of the round table) */
// 編寫人:Lancelot Cheng
public class KinghtsRoundTable extends Human {
private String title, weapon;

// 建構子
public KinghtsRoundTable (String nn, String bD, String bb, String tt, String ww) {
super(nn, bD, bb); // 使用父類別的建構子。
title = tt;
weapon = ww;
}

// 展現圓桌武士的檔案
public void showKinghtFile() {
showBasicallFile(); // 因為有繼承父類別,所以可以直接使用其方法,父類別和子類別的方法名稱必須不同。
System.out.println("稱號:" + title + ";武器:" + weapon);
}
}

子類別:皇室,同上。
/* 子類別:皇室(royal family ) */
// 編寫人:Lancelot Cheng
public class RoyalFamily extends Human {
private String title, hat;

// 建構子
public RoyalFamily (String nn, String bD, String bb, String tt, String hh) {
super(nn, bD, bb); // 使用父類別的建構子。
title = tt;
hat = hh;
}

// 展現皇室成員檔案
public void showRoyalFamilyFile() {
showBasicallFile(); // 因為有繼承父類別,所以可以直接使用其方法,父類別和子類別的方法名稱必須不同。
System.out.println("頭銜:" + title + ";頭冠:" + hat);
}
}

主程式:產生平凡人我是直接用父類別 Human 產生的。
/* 主程式 */
// 這個程式主要示範繼承。
// 編寫人:Lancelot Cheng
public class Main {
public static void main(String[] args) {

// 產生理查平凡人物件,並給值與展現其值。
Human richard = new Human( "理查", "0307", "O");
richard.showBasicallFile();

System.out.println();

// 產生藍斯洛特圓桌武士物件,並給值與展現其值。
KinghtsRoundTable lancelot = new KinghtsRoundTable( "藍斯洛特", "1228", "AB", "騎士之花", "樹枝");
lancelot.showKinghtFile();

System.out.println();

// 產生桂妮薇兒皇室成員物件,並給值與展現其值。
RoyalFamily guinevere = new RoyalFamily( "桂妮薇兒", "0614", "A", "公主", "鏡影神冠");
guinevere.showRoyalFamilyFile();
}
}

結果:
名字:理查;生日:0307;血型:O

名字:藍斯洛特;生日:1228;血型:AB
稱號:騎士之花;武器:樹枝

名字:桂妮薇兒;生日:0614;血型:A
頭銜:公主;頭冠:鏡影神冠

Process finished with exit code 0

  Elton 補充:只要不是抽象類別,皆可產生物件,一般情況大多還是用子類別來產生物件,但還是可以視情況用父類別來產生物件。

  本來是要寫物件之間關係的範例,發現我還沒有寫繼承,所以先寫了這一篇,之後會修改上述的程式碼,成為其他篇的範例。

沒有留言:

張貼留言