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

Java 封裝藝術:從資料隱藏到介面設計的核心原則

     編輯:Java 程式設計入門

前言:為什麼需要「外殼」?

物件導向的核心在於將資料與操作資料的行為封裝在一起。但並非所有內部細節都應對外暴露——就像手電筒的塑膠外殼隱藏了電路與電池,只保留「開關」與「充電孔」兩個介面。封裝正是這層「外殼」:保留有限的公共介面,隱藏具體實作細節,從而提升易用性與安全性。

充電手電筒:只暴露開關與充電介面
良好的封裝如手電筒:使用者無需了解內部電路,只需掌握開關與充電
未封裝的遙控器:細節全暴露
缺乏封裝:內部細節全暴露,使用者易誤操作導致損壞

一、Java 封裝的三大關鍵字

修飾符可見性適用場景
public全域可見構成類別的公共介面(API)
private僅類別內部可見隱藏內部狀態與輔助方法
protected同套件 + 子類別可見繼承體系中的受保護成員(後續章節詳述)

二、實戰範例:封裝 Human 類別

class Human {
    // 建構子:初始化身高
    public Human(int h) {
        this.height = h;
        System.out.println("I'm born");
    }

    // 公開介面:取得身高
    public int getHeight() { return this.height; }

    // 公開介面:增長身高
    public void growHeight(int h) { this.height += h; }

    // 內部私有方法:呼吸細節
    private void breath() { System.out.println("hu...hu..."); }

    // 公開介面:重複呼吸(委派給私有方法)
    public void repeatBreath(int rep) {
        for (int i = 0; i < rep; i++) this.breath();
    }

    // 私有資料成員:身高
    private int height;
}

封裝效果驗證

public class Test {
    public static void main(String[] args) {
        Human aPerson = new Human(160);
        System.out.println(aPerson.getHeight()); // 160
        aPerson.growHeight(10);
        System.out.println(aPerson.getHeight()); // 170
        aPerson.repeatBreath(3); // hu...hu... ×3

        // 編譯錯誤:height has private access in Human
        // System.out.println(aPerson.height);
    }
}
加了殼的遙控器:Human 類別公開介面圖
封裝後的 Human:僅暴露 getHeight、growHeight、repeatBreath 三個公共介面

三、封裝的核心價值

  1. 資料保護:將 height 設為 private,外部只能透過 getHeight()/growHeight() 存取。類別設計者可在方法中加入驗證邏輯(如身高不可為負)。
  2. 實作隱藏:breath() 內部細節對外不見,未來改用 inhale()/exhale() 也不影響呼叫端。
  3. 降低耦合:呼叫端僅依賴穩定的公共介面,內部重構零風險。

四、類別層級的封裝:套件私有與 public 類別

  • 單一 .java 檔案中僅能有一個 public 類別(檔名必須與該類別同名)。
  • 無修飾符的類別為套件私有,僅同套件可見,適合作為內部實作類。
  • 這與成員層級的 private/public 形成兩層封裝防線:類別層級控制「誰能用這個類」,成員層級控制「誰能碰這個欄位/方法」。

五、練習題:設計 Torch 類別

要求:

  • 內部狀態:batteryLevel(電量,private)
  • 公開介面:switchOn()、switchOff()、charge()
  • 邏輯:電量為 0 時開關無效;充電增加電量上限 100
class Torch {
    private int batteryLevel = 0;
    private boolean isOn = false;

    public void switchOn() {
        if (batteryLevel > 0) { isOn = true; System.out.println("光線亮起"); }
        else System.out.println("電量耗盡,請充電");
    }
    public void switchOff() { isOn = false; System.out.println("關閉"); }
    public void charge(int amount) {
        batteryLevel = Math.min(100, batteryLevel + amount);
        System.out.println("充電完成,當前電量:" + batteryLevel);
    }
}

六、總結

  • 封裝 = 隱藏實作 + 暴露介面,以 private 守護資料,以 public 定義契約。
  • 資料成員宜 private,行為介面宜 public,是 Java 類別設計的鐵律。
  • 類別層級的 public/套件私有,構建更大尺度的模組邊界。

設計原則:「高內聚、低耦合」的起點就是嚴格封裝。每個 private 宣告,都是在為未來的變更買單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved