| 維度 | abstract class | interface |
|---|---|---|
| 關鍵字 | abstract class | interface |
| 繼承/實作 | extends (單繼承) | implements (多實作) |
| 方法預設 | 可有具體方法、建構子、靜態方法 | Java 8 前全 abstract;Java 8+ 可有 default/static/private 方法 |
| 欄位 | 任意修飾符、可變實例欄位 | 隱含 public static final (常量) |
| 存取修飾符 | 任意 | 方法隱含 public (Java 9+ 可 private) |
| 建構子 | 可有 (供子類呼叫) | 不可有 |
這是選型的**靈魂準則**,超越語法限制:
Dog extends Animal、ArrayList extends AbstractListBird implements Flyable、Airplane implements Flyable、ArrayList implements Serializable, Cloneable, RandomAccessDoor 有 open()、close()。新增報警功能 alarm()。
// 將不相關功能強行合併
abstract class Door { // 或 interface Door
abstract void open();
abstract void close();
abstract void alarm(); // 報警不是門的本質
}
class AlarmDoor extends Door { ... } // 或 implements Door
後果:純粹的 Door 使用者受 alarm() 變更影響;報警器變更波及門模組。
// 本質層面:門就是門
abstract class Door {
abstract void open();
abstract void close();
}
// 能力層面:具備報警能力
interface Alarm {
void alarm();
}
// 組合:既是門,又有報警能力
class AlarmDoor extends Door implements Alarm {
public void open() { ... }
public void close() { ... }
public void alarm() { ... }
}
若領域模型認為「報警器才是本質,頂多頂多有門功能」:
abstract class Alarm { abstract void alarm(); }
interface Door { void open(); void close(); }
class DoorAlarm extends Alarm implements Door { ... }
| 版本 | 介面新增能力 | 影響 |
|---|---|---|
| Java 8 | default 方法、static 方法 | 介面可提供預設實作,減少抽象類別必要性 |
| Java 9 | private 方法、private static 方法 | 介面內部復用邏輯,封裝性增強 |
| Java 17 | 密封類別 sealed class | 限制繼承層級,配合介面實現代數資料型別 |