許多開發者誤以為接口是為彌補 Java 無多重繼承而生。實則不然:接口的核心價值在於類型抽象——定義「一類對象擁有什麼行為」,而非「如何實現」。繼承用於代碼復用與 IS-A 關係,接口用於契約規範與多態解耦,二者設計意圖截然不同。
假設需支援 MySQL、Oracle、SQL Server 等多種數據庫,首先定義統一契約:
package org.bromon.test;
import java.sql.Connection;
public interface DB {
Connection openDB(String url, String user, String password);
void close();
}
各具體實現類(如 Mysql、Oracle)實現此接口。但應用層不應直接 new Mysql(),否則換庫仍需改代碼。引入簡單工廠封裝實例化邏輯:
package org.bromon.test;
public class DBFactory {
public static DB getConn() {
return new Mysql(); // 可改為讀取配置動態決定
}
}
調用端僅依賴接口:DB myDB = DBFactory.getConn();。若需擴展,可演進為抽象工廠進一步解耦。
「為了復用 run() 而繼承」是典型誤區。若 B 需要 A 的功能,組合/委派(A a = new A(); a.run();)往往優於繼承。繼承僅適用於抽象類定義模板的場景(如 Template Method 模式),子類填補具體步驟。濫用繼承會導致脆弱的類層級結構,維護成本劇增。