| 特性 | 介面 | 抽象類 |
|---|---|---|
| 關鍵字 | interface | abstract class |
| 方法 | 預設 public abstract(Java 8+ 可 default/static/private) | 可混合抽象/具體/靜態/私有方法 |
| 欄位 | 隱式 public static final(常量) | 任意修飾符、任意型別 |
| 建構子 | 無 | 有(供子類鏈式調用) |
| 繼承 | implements 多實現 | extends 單繼承 |
| 靜態區塊 | 不可有 | 可有 |
Car extends Vehicle、Dog extends Animal。Bird implements Flyable、Airplane implements Flyable、Penguin implements Swimmable。AbstractList 實作 addAll 依賴抽象 add。Comparable、Serializable、Runnable。// 錯誤設計:將警報塞入 Door 抽象類或介面
abstract class Door { abstract void open(); abstract void close(); abstract void alarm(); }
// 問題:防火門需要 alarm,普通門不需要 → 違反介面隔離原則
// 正確設計:分離關注點
interface Alarm { void alarm(); }
abstract class Door { void open(); void close(); }
class FireDoor extends Door implements Alarm {
public void alarm() { /* 警報邏輯 */ }
}
class NormalDoor extends Door { /* 無 alarm */ }
default 方法:提供預設實現,減少抽象類作為「提供默認行為」的必要性。static 方法:工具方法歸屬介面,如 Stream.of()。private 方法:default 方法間共用邏輯。注意:介面仍無實例欄位、無建構子、無狀態。需共享狀態或定義模板算法時,抽象類仍不可替代。
AbstractXXX 簡化擴展,對外暴露介面。Readable/Writable/Closeable。Collection(介面)→ 定義契約AbstractCollection(抽象類)→ 實作 addAll、toString 等模板方法ArrayList 繼承 AbstractList 實作 get/set/addList 介面繼承 Collection,增加有序、可重複語義這展示了「介面定義型別層次,抽象類提供實現骨架」的經典分層。