當基底類別僅為衍生類別提供共同介面,不希望被直接實例化時,使用 abstract 關鍵字:
abstract class Shape {
abstract void draw(); // 抽象方法:無主體,強制子類實作
void commonMethod() { ... } // 可有具體實作
}
new Shape() 會編譯錯誤;interface 將抽象概念推進一步:
public static final(常數);interface Drawable {
void draw(); // 隱含 public abstract
}
class Circle implements Drawable { ... }
| 特性 | 抽象類別 | 介面 |
|---|---|---|
| 方法實作 | 可有具體方法 | Java 8 前不可有(default/static 除外) |
| 欄位 | 任意 | 只能是常數 |
| 建構子 | 可有 | 不可有 |
| 繼承關係 | 單繼承 | 多實作 |
| 適用場景 | 「是一種」關係,共享程式碼 | 「能做什麼」契約,跨類別層級 |
「對介面程式設計,而非實作」—— 透過介面解耦模組,支援多型替換、單元測試模擬、外掛擴充等進階架構模式。
抽象類別與介面是 Java 型別系統的基石:前者提供「部份實作 + 強制契約」,後者定義「純粹契約」。善用兩者,能建構出高內聚、低耦合、易擴充的物件導向系統。