繼承是物件導向三大特性之一,讓子類別自動擁有父類別的屬性與方法,並可擴充或覆寫行為。父類別提供通用邏輯,子類別專注差異化實作,實現程式碼複用與多態基礎。
class Car {
int size;
String color;
}
class Truck extends Car {
String packingBox; // 貨車特有屬性
}
子類別透過 extends 關鍵字繼承父類別,Truck 實例即擁有 size、color 且可新增 packingBox。
當子父類別出現同名成員時,super 用於明確呼叫父類別版本:
class SuperClass { int i = 10; }
class SubClass extends SuperClass {
int i = 20;
void show() {
System.out.printf("super.i=%d, this.i=%d%n", super.i, this.i);
}
}
// 輸出:super.i=10, this.i=20
| 規則 | 說明 | 違反後果 |
|---|---|---|
| 簽名必須相同 | 回傳型別、方法名、參數列表一致 | 編譯錯誤:return type incompatible |
| 存取權限不得縮小 | 子類別權限 ≥ 父類別 | 編譯錯誤:weaker access privileges |
| @Override 註解 | 編譯期檢查是否真正覆寫 | 避免拼字錯誤導致誤以為覆寫 |
class Animal {
public void speak() { System.out.println("Animal sound"); }
}
class Cat extends Animal {
@Override
public void speak() {
super.speak(); // 保留父類別行為
System.out.println("Meow~");
}
}
public > protected > default > private。
繼承時,子類別可見性:public/protected 可直接存取,default 同套件可見,private 需透過 getter/setter。
善用繼承能大幅降低維護成本,但切記組合優於繼承——當「是一種」關係不成立時,優先考慮組合/介面設計。