《Java 程式設計哲學》強調:程式碼複用不僅是複製貼上,更是設計層面的藝術。Java 提供了三種核心複用機制——組合、繼承、委派,掌握它們的適用場景與優劣勢,是寫出高內聚、低耦合程式碼的關鍵。
在新類別中嵌入現有類別的物件,新類別由現有類別的物件組成。
class Engine { void start() { System.out.println("引擎啟動"); } }
class Car {
private Engine engine = new Engine(); // 組合
void start() { engine.start(); }
}
優點:封裝性強、耦合度低、執行期可動態替換組件。
缺點:需手動轉發方法呼叫,程式碼略顯冗長。
透過 extends 關鍵字,子類別自動擁有父類別的非私有成員。
class Animal { String name; void eat() {} }
class Cat extends Animal { void meow() {} }
優點:程式碼複用最直接,支援多型。
缺點:破壞封裝、父子類別強耦合、單一繼承限制。
Java 無直接委派語法,但可透過「組合 + 介面」模擬:
interface Logger { void log(String msg); }
class ConsoleLogger implements Logger { public void log(String msg) { System.out.println(msg); } }
class Service {
private Logger logger = new ConsoleLogger(); // 組合
public void setLogger(Logger logger) { this.logger = logger; } // 動態委派
void doWork() { logger.log("Working..."); }
}
核心思想:將具體實作委派給其他物件,保持介面穩定,實現「委派 = 繼承 + 組合」的靈活性。
子類別定義與父類別同名但參數不同的方法,不會遮蔽 父類別的任何版本,重載機制在整個繼承鏈中正常運作。
一個最清晰的判斷方法就是問自己:是否需要將新類別向基類別進行向上轉型?
類別複用的本質是管理依賴關係。組合提供靈活性,繼承提供多型,委派在兩者間取得平衡。優秀的 Java 開發者,不是盡可能使用繼承,而是根據業務場景,在三者中做出最適合的架構決策。