首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 基礎教程:組合模式與 has-a 關係深度解析

     編輯:Java 程式設計入門

面向對象設計中,代碼復用除繼承外,組合是更靈活、耦合更低的核心手段。組合對應現實世界的「整體-部分」關係: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%
    }
}

has-a 關係:菱形連線指向整體

組合優勢:復用與解耦

  • 復用性:Battery 可被 Phone、Calculator、Drone 等任意類復用,無需重寫電量邏輯。
  • 封裝性:Torch 內部如何用電池,外部不可見;電池換型號(鋰電→氫燃料),只改 Battery 實現,Torch 不變。
  • 動態性:運行時可替換部件對象(如換電池),繼承則靜態綁定。
  • 避免繼承爆炸:若用繼承,RechargeableTorch、SolarTorch、HandCrankTorch... 類數量指數級增長。

基本類型 vs 普通類型:內存模型差異

Java 八大基本類型(int、double、boolean...)非對象,為效率直接存值於棧幀;普通類型(自定義類)為引用類型,對象在堆,變量存引用。

自動裝箱/拆箱(JDK 5+)讓基本類型與包裝類無縫轉換,但頻繁裝箱產生臨時對象,高性能場景需警惕。理解「一切皆對象」在 Java 中是「基本類型除外」的務實妥協。

設計原則:優先組合,繼承次之。除非明確是「is-a」關係且符合里氏替換原則,優先考慮組合/委託。組合讓系統像樂高積木一樣靈活組裝、替換、擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性基本類型普通類型
聲明即分配內存是否(需 new)
默認值0/false/0.0null
傳值/傳引用傳值傳引用
對應包裝類Integer/Double/Boolean...無需