Java 封裝機制中,private 修飾的成員變數(包含實例變數與靜態變數)無法被外部類別直接存取。但若提供 public 的 getter/setter 方法,即可實現跨包、跨類的受控存取。本文說明其運作原理與設計重點。
無論變數以何種修飾符(private、protected、default、public)宣告,只要對應的 getter/setter 方法為 public,其他套件、類別即可透過這些方法存取該變數。
package com.example.model;
public class User {
// 私有實例變數
private String name;
// 私有靜態變數
private static int count = 0;
// 公共 getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getCount() {
return count;
}
public static void setCount(int count) {
User.count = count;
}
}
package com.other.package;
import com.example.model.User;
public class Test {
public static void main(String[] args) {
User u = new User();
u.setName("Alice"); // 跨包設定 private 實例變數
System.out.println(u.getName()); // 跨包讀取
User.setCount(10); // 跨包設定 private 靜態變數
System.out.println(User.getCount()); // 跨包讀取
}
}
static 變數屬於類別,其 getter/setter 同樣建議宣告為 static,透過類別名稱呼叫。final。getXxx/setXxx、isXxx for boolean),以便框架(如 Spring、Jackson)自動識別與操作。「private 變數完全無法被外部存取」——錯誤。private 僅限制「直接存取」,透過公共方法間接存取是標準做法。
掌握此機制,即能靈活運用封裝,打造安全且可維護的 Java 類別。