Java 定義了 11 種修飾符,涵蓋存取控制、行為語意、執行時特性等維度。本文系統整理其適用對象、核心語意與實務注意點,供開發者快速查閱與決策。
| 修飾符 | 適用對象 | 核心語意 | 實務要點 |
|---|---|---|---|
public |
類別、介面、成員 | 跨封裝包可存取,視野最廣 | API 公開介面首選;謹慎用於欄位(破壞封裝) |
private |
成員(欄位、方法、巢狀類別) | 僅限定義該成員的類別內部存取 | 封裝核心,預設選擇;內部類別可存取外部類別私有成員 |
protected |
成員 | 同封裝包可存取;跨封裝包僅限子類別存取 | 設計繼承體系時開放給子類;介面成員不可為 protected |
static |
巢狀類別、方法、欄位、靜態初始化區塊 | 屬於類別而非實例;靜態方法無 this;靜態欄位全類別共享單一拷貝;靜態區塊類別載入時執行 |
工具方法、常數、單例模式常用;避免靜態方法過度耦合業務邏輯 |
final |
類別、方法、欄位、區域變數 | 類別不可繼承;方法不可覆寫;欄位/變數賦值後不可變(參考不變,物件內容仍可變) | 不可變物件設計基石;搭配 static 定義編譯期常數 |
abstract |
類別、介面、方法 | 類別不可實例化;方法無主體,強制子類別實作;含抽象方法的類別必須為 abstract | 定義協議與模板方法;介面隱含 abstract |
| 修飾符 | 適用對象 | 核心語意 | 典型場景 |
|---|---|---|---|
native |
方法 | 方法體由原生程式碼(C/C++)實作,透過 JNI 呼叫 | 平台特有功能、效能關鍵路徑、整合舊有程式庫 |
strictfp |
類別、方法 | 強制浮點運算嚴格遵循 IEEE 754 標準,禁止使用平台額外精度 | 跨平台數值計算一致性要求嚴格的科學/金融運算 |
synchronized |
方法、區塊 | 內建鎖機制:靜態方法鎖定 Class 物件;實例方法鎖定實例物件 | 簡單執行緒同步;高併發建議改用 java.util.concurrent 套件 |
volatile |
欄位 | 保證可見性與禁止指令重排;不保證原子性 | 狀態旗標、雙重檢查鎖單例;可替代輕量同步場景 |
transient |
欄位 | 序列化時忽略該欄位,不持久化 | 敏感資料(密碼)、衍生欄位、非序列化物件引用 |
abstract 與 final、private、static、native、synchronized 互斥。public static final(欄位)與 public abstract(方法)。static 與 abstract 不可同時修飾方法(Java 8 後介面可有 static 預設實作)。精準選擇修飾符,是體現設計意圖、保障封裝與並發安全的關鍵。