基礎程式設計(Java)· CH9

繼承

is-a · extends · protected · 覆寫 · super · Object · 導覽地圖

本章列入本學期考試範圍

完整內容看 PDF 講義,互動對照與試跑看 index。

全章主線

is-a vs has-a:最關鍵的分界

is-a → 繼承(extends)
「子類別是一種父類別」
Dog is-a Animal
BasePlusCommissionEmployee is-a CommissionEmployee
has-a → 組合(欄位)
「一個物件內含另一個」
Car has-a Engine
Employee has-a Date

問一句:「A 是一種 B」還是「A 有一個 B」。不確定時傾向組合。

衍生子類別

extends:自動取得父類別成員

class Dog extends Animal {        // Dog is-a Animal
    public Dog(String name) { super(name); }
    // 沒寫 getName(),卻能呼叫——繼承來的
}

子類別自動擁有父類別可見成員。Java 單一繼承:只能 extends 一個直接父類別(可層層 A→B→C)。

存取層級

protected:讓子類別看得到

protected double grossSales;   // 自己 + 子類別 + 同套件
private double commissionRate; // 只有自己;子類別看不到
寬 → 窄
public → protected →(package)→ private
Deitel 建議
優先 private + getter/setter,少直接開 protected 欄位(破壞封裝)

改寫父方法

覆寫(overriding)與 @Override

class Dog extends Animal {
    @Override public String speak() { return "汪汪"; }
}
// new Dog().speak() → "汪汪"(走子版本)

覆寫=子改父、同簽名;多載=同類別、不同參數列。@Override 讓編譯器檢查簽名,打錯立刻報錯。

回呼父類別

super:呼叫父版本/父建構子

@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(...) → 編譯錯。

共同始祖

Object:所有類別的父類別

@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 且子類別能替換父類別出現處 → 繼承
  • has-a(內含)→ 組合(CH8)
  • 不確定 → 傾向組合(耦合鬆、好維護;繼承讓子綁死父實作)

只為「省去重抄」而繼承一個 is-a 不成立的類別,設計會變脆。

接下來

建立「看到共通成員 → 想想抽父類別」的直覺

  • PDF 講義 完整內容+類別階層/super 呼叫鏈藍圖圖
  • index 階層步進+試跑(extends/super/覆寫)+is-a/has-a 判別
  • 本地練習 5 題 extends/super/建構子順序/protected/toString+equals
  • 複習測驗 自測到 90%