物件導向的核心在於將資料與操作資料的行為封裝在一起。但並非所有內部細節都應對外暴露——就像手電筒的塑膠外殼隱藏了電路與電池,只保留「開關」與「充電孔」兩個介面。封裝正是這層「外殼」:保留有限的公共介面,隱藏具體實作細節,從而提升易用性與安全性。
| 修飾符 | 可見性 | 適用場景 |
|---|---|---|
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);
}
}
height 設為 private,外部只能透過 getHeight()/growHeight() 存取。類別設計者可在方法中加入驗證邏輯(如身高不可為負)。breath() 內部細節對外不見,未來改用 inhale()/exhale() 也不影響呼叫端。.java 檔案中僅能有一個 public 類別(檔名必須與該類別同名)。private/public 形成兩層封裝防線:類別層級控制「誰能用這個類」,成員層級控制「誰能碰這個欄位/方法」。Torch 類別要求:
batteryLevel(電量,private)switchOn()、switchOff()、charge()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宣告,都是在為未來的變更買單。