面向對象設計中,代碼復用除繼承外,組合是更靈活、耦合更低的核心手段。組合對應現實世界的「整體-部分」關係:has-a(擁有)。

手電筒擁有電池、LED、按鈕等組件。通過組合,手電筒類委託電池對象管理電量狀態:
class Battery {
private double power = 0.0; // 0~1
public void charge(double p) {
power = Math.min(1.0, power + p);
}
public boolean use(double p) {
if (power >= p) {
power -= p;
return true;
}
power = 0;
return false;
}
}
class Torch {
private Battery battery = new Battery(); // 組合:創建部件對象
public void turnOn(int hours) {
boolean ok = battery.use(hours * 0.1); // 每小時消耗 10%
if (!ok) System.out.println("電量耗盡,請充電!");
}
public void charge(int hours) {
battery.charge(hours * 0.2); // 每小時充電 20%
}
}

Battery 可被 Phone、Calculator、Drone 等任意類復用,無需重寫電量邏輯。Torch 內部如何用電池,外部不可見;電池換型號(鋰電→氫燃料),只改 Battery 實現,Torch 不變。RechargeableTorch、SolarTorch、HandCrankTorch... 類數量指數級增長。Java 八大基本類型(int、double、boolean...)非對象,為效率直接存值於棧幀;普通類型(自定義類)為引用類型,對象在堆,變量存引用。
| 特性 | 基本類型 | 普通類型 |
|---|---|---|
| 聲明即分配內存 | 是 | 否(需 new) |
| 默認值 | 0/false/0.0 | null |
| 傳值/傳引用 | 傳值 | 傳引用 |
| 對應包裝類 | Integer/Double/Boolean... | 無需 |