介面是完全抽象的類別(Java 8 前):所有方法隱含 public abstract,所有欄位隱含 public static final(常數)。一個類別可實作多個介面,實現多重繼承效果。
| 版本 | 新增特性 |
|---|---|
| Java 8 | default 方法、static 方法、函數式介面(@FunctionalInterface) |
| Java 9 | private 方法、private static 方法 |
| Java 10+ | 無重大語法變更,型別推論增強 |
public static final 常數。default/static/private 實作。interface A extends B, C),不需實作方法。interface A { default void foo() { System.out.println("A"); } }
interface B { default void foo() { System.out.println("B"); } }
class C implements A, B {
// 必須顯式覆寫解決衝突
@Override
public void foo() {
A.super.foo(); // 可選擇調用特定介面實作
// 或 B.super.foo();
}
}
| 場景 | 推薦 | 理由 |
|---|---|---|
| 定義「是什麼」核心契約、多實作替換 | 介面 | 支援多實作、解耦、測試友善 |
| 共享代碼、狀態、非公用細節 | 抽象類別 | 可有建構子、欄位、非 public 方法 |
| 需單一繼承層次、模板方法模式 | 抽象類別 | Java 單繼承限制 |
| 函數式介面(Lambda 目標) | 介面 + @FunctionalInterface | 唯一抽象方法 |
update(),主題持有介面列表通知觀察者。介面是 Java 實現「契約導向設計」的基石。從單純的方法宣告演進至擁有預設實作、靜態方法、私有方法,現代介面既保持抽象契約優勢,又提供代碼複用能力。善用介面定義邊界、隔離變化、實現多型,是寫出高內聚、低耦合系統的關鍵。