基礎程式設計(Java)· CH9
is-a · extends · protected · 覆寫 · super · Object · 導覽地圖
本章列入本學期考試範圍
完整內容看 PDF 講義,互動對照與試跑看 index。
全章主線
問一句:「A 是一種 B」還是「A 有一個 B」。不確定時傾向組合。
衍生子類別
class Dog extends Animal { // Dog is-a Animal
public Dog(String name) { super(name); }
// 沒寫 getName(),卻能呼叫——繼承來的
}
子類別自動擁有父類別可見成員。Java 單一繼承:只能 extends 一個直接父類別(可層層 A→B→C)。
存取層級
protected double grossSales; // 自己 + 子類別 + 同套件
private double commissionRate; // 只有自己;子類別看不到
改寫父方法
class Dog extends Animal {
@Override public String speak() { return "汪汪"; }
}
// new Dog().speak() → "汪汪"(走子版本)
覆寫=子改父、同簽名;多載=同類別、不同參數列。@Override 讓編譯器檢查簽名,打錯立刻報錯。
回呼父類別
@Override public String toString() {
return "底薪型 — " + super.toString(); // 沿用父版本再加工
}
public BasePlus(...) {
super(first, last, sales, rate); // 必須是建構子第一行
this.baseSalary = base;
}
super(...) 只能放第一行(與 this(...) 二選一)。子類別沒寫時 Java 自動補 super()。
執行順序
class A { A() { print("A"); } }
class B extends A { B() { print("B"); } }
class C extends B { C() { print("C"); } }
// new C() → A → B → C
每個建構子第一行先跑 super(),所以最先初始化最上層的父類別。陷阱:父類別只有帶參數建構子、子沒寫 super(...) → 編譯錯。
共同始祖
@Override public String toString() { return "(" + x + ", " + y + ")"; }
@Override public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point p = (Point) o; return x == p.x && y == p.y;
}
沒寫 extends 時隱含 extends Object。覆寫 toString 讓物件好讀;覆寫 equals 比內容(這就是「== 比物件、equals 比內容」的由來)。
取捨
只為「省去重抄」而繼承一個 is-a 不成立的類別,設計會變脆。
接下來