在物件導向設計中,並非所有類別都用於描述具體物件。當一個類別缺乏足夠資訊來描述一個具體對象時,我們稱之為「抽象類」。它代表領域分析中提煉出的抽象概念,無法被實例化,但能定義一組固定的行為規範,具體實現交由子類別完成。而「介面」則更進一步,它是完全抽象的契約,僅包含方法宣告與常數,支援多重實現,是解耦合的關鍵工具。
public abstract class Fruit {
private double weight; // 通用屬性
public Fruit(double weight) { this.weight = weight; }
// 抽象方法:強制子類實作
public abstract void eat();
// 具體方法:提供預設行為
public double getWeight() { return weight; }
}
public class Apple extends Fruit {
public Apple(double weight) { super(weight); }
@Override public void eat() { System.out.println("咬一口脆甜的蘋果"); }
}
public abstract,欄位為 public static finaldefault 方法(提供預設實作)、static 方法、private 方法implements 多個介面interface DriverLicence {
Licence getLicence(); // 契約:誰有駕照誰能開車
}
// 學生、白領、藍領、老闆皆可實現此介面
class StudentDriver extends Student implements DriverLicence { ... }
class BossDriver extends Boss implements DriverLicence { ... }
// 汽車類只依賴介面,不關心具體是誰在開車
class Car {
public void setDriver(DriverLicence driver) { ... }
}
| 維度 | 抽象類 | 介面 |
|---|---|---|
| 關係語意 | is-a (繼承體系核心) | can-do / has-ability (橫向能力) |
| 繼承/實現 | 單一繼承 (extends) | 多重實現 (implements) |
| 欄位類型 | 任意 (instance/static/final) | 僅 static final 常數 |
| 方法類型 | 抽象 + 具體 + 建構子 | 抽象 + default/static/private (Java 8+) |
| 設計目的 | 程式碼複用、模板方法模式 | 契約規範、解耦、多型替換 |
抽象類是「提取公因式」的重構產物,介面是「雜湊不相干類別」的契約工具。現代 Java 開發傾向「介面優先,抽象類輔助」,善用 default 方法演進介面而不破壞相容性。理解兩者本質差異,才能設計出高內聚、低耦合、易擴充的系統架構。