Java 提供豐富的存取修飾符控制類、欄位、方法的可見性與行為特性。本文系統整理三大維度的修飾符分類、語義與最佳實踐。
一、類的修飾符
| 分類 | 修飾符 | 說明 |
| 存取控制 | public | 公共類,任何地方可訪問。主類必須為 public |
| (無修飾符) | 包私有,僅同包內可訪問 |
| 非存取控制 | abstract | 抽象類,不可實例化,可包含抽象方法 |
| final | 最終類,不可被繼承,方法隱含 final |
二、欄位(屬性)修飾符
存取控制(四種)
- public:全域可訪問,破壞封裝,慎用
- private:僅本類可訪問,封裝核心
- protected:本類 + 同包 + 子類(跨包)可訪問
- private protected:極少用,本類 + 子類可訪問(已淘汰)
非存取控制(四種)
- static:類屬性,共享單一儲存空間,所有實例見相同值
- final:常量,初始化後不可變,編譯期常量折疊優化
- volatile:多線程可見性保證,禁止指令重排,不保證原子性
- transient:序列化時忽略該欄位,不持久化
三、方法修飾符
存取控制(同欄位四種)
- public / private / protected / private protected
非存取控制(五種)
- abstract:無方法體,子類必須實作(除非子類也 abstract)
- static:類方法,無
this 參考,只能訪問 static 成員
- final:不可覆寫,鎖定實作。private 方法隱含 final
- native:本地方法,由 C/C++ 實作,透過 JNI 呼叫
- synchronized:同步方法,隱含鎖為
this(實例方法)或 Class 物件(static 方法)
關鍵組合規則
abstract 不能與 final、static、private、native、synchronized 共存
static 不能與 abstract 共存(介面方法除外,JDK 8+ 支援 static/default)
volatile 僅能修飾欄位,不能修飾方法/類
transient 僅能修飾欄位,static/transient 欄位不序列化
最佳實踐建議
- **封裝優先**:欄位預設
private,提供公共 getter/setter
- **最小權限**:類、方法預設包私有,需要時再放寬
- **常量定義**:
public static final 命名全大寫下劃線分隔
- **線程安全**:共享可變狀態用
volatile 或同步機制,不可變物件優先
- **序列化控制**:敏感資料、衍生欄位加
transient