多態、介面、抽象類是 Java 物件導向設計的三大基石。掌握它們的語義差異與適用場景,是寫出高內聚、低耦合代碼的關鍵。
定義:父類引用指向子類物件(Animal cat = new Cat();)。
核心規則:
語義表達:Cat IS-A Animal(貓是一種動物),體現「是一種」關係。
定義:interface 關鍵字聲明,Java 8 前所有方法隱式 public abstract,欄位隱式 public static final。
核心規則:
implements 實現介面,必須實現所有抽象方法(除非類別也是抽象類)。default、static、private 方法,增強演進能力。語義表達:Cat HAS-A Jumpable(貓具備跳躍能力),體現「具備某種行為」關係。
定義:abstract class 關鍵字聲明,可包含抽象方法與具體方法、構造器、各種訪問修飾符的欄位。
核心規則:
extends 繼承。語義表達:Cat HAS-BEHAVIOR Eating(貓擁有進食行為的具體邏輯),體現「共享核心實現」關係。
| 場景 | 推薦選擇 | 理由 |
|---|---|---|
| 定義跨領域的通用行為規範(如 Serializable、Comparable) | 介面 | 支援多實現,無狀態,純契約 |
| 多個子類共享核心邏輯、狀態(如 Template Method 模式) | 抽象類 | 提供預設實現,封裝共同狀態 |
| 需要靈活組合多種行為(如 Flyable + Swimmable) | 介面 | 組合優於繼承,避免類爆炸 |
| 框架層強制規範子類生命週期(如 Servlet、Thread) | 抽象類 | 控制實例化流程,提供鉤子方法 |
「介面定義做什麼,抽象類定義是什麼,多態實現怎麼做。」實戰中優先用介面定義契約,再用抽象類提煉共性實現,最後通過多態實現運行時動態綁定。