繼承是物件導向三大特性之一,讓子類別能重用父類別的程式碼,並延伸專屬功能。本文從定義語法、存取權限、方法重載與覆寫、到實戰範例,完整梳理 Java 繼承機制。
[修飾符] class 子類別名 extends 父類別名 {
// 子類別主體:新增欄位、方法、建構子、內部類別等
}
extends 關鍵字建立「is-a」關係。public class Employee {
private String name;
private int id;
private double salary;
private String department;
// 建構子、getter/setter、toString() 略
}
public class Manager extends Employee {
private double specialSalary; // 專屬津貼
public Manager() { super(); }
public Manager(String name, int id, double salary, String dept, double specialSalary) {
super(name, id, salary, dept);
this.specialSalary = specialSalary;
}
// getter/setter、toString() 呼叫 super.toString() 略
}
super(...) 必須放在建構子第一行,用於初始化父類別狀態。
| 父類別修飾符 | 同套件子類別 | 不同套件子類別 |
|---|---|---|
| public | ✅ 可直接存取 | ✅ 可直接存取 |
| protected | ✅ 可直接存取 | ✅ 可直接存取 |
| default (package-private) | ✅ 可直接存取 | ❌ 不可直接存取 |
| private | ❌ 不可直接存取 | ❌ 不可直接存取 |
解決方案:透過父類別提供的 public 或 protected 方法(getter/setter)間接存取 private 或 default 成員。
同一類別(或父子類別)中,方法名稱相同但參數列表不同(型別、個數、順序)。
// Employee
public void setInfo(String name, int id, double salary, String dept) { ... }
// Manager 重載:參數多一個 specialSalary
public void setInfo(String name, int id, double salary, String dept, double specialSalary) {
super(name, id, salary, dept);
this.specialSalary = specialSalary;
}
子類別定義與父類別簽名完全相同的方法(回傳型別、方法名、參數列表),實現多態。兩種常見形式:
super.method(),再補充邏輯。equals() 比較物件內容Object.equals() 預設比較參考位址。若需比較「內容相等」,需覆寫:
public class ComplexNumber {
private double re, im;
// 建構子、getter/setter 略
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
ComplexNumber other = (ComplexNumber) obj;
return Double.compare(re, other.re) == 0 && Double.compare(im, other.im) == 0;
}
// toString()、main() 測試略
}
測試結果:(2.0 + 3.0i) <> (2.0 - 3.4i),正確判定不相等。
@Override 註解,編譯器會協助檢查簽名是否正確。private 修飾需給子類別用的欄位/方法;優先考慮 protected。super() 顯式或隱式呼叫父建構子。