一、訪問控制修飾符
| 修飾符 | 類 | 接口 | 方法 | 字段 | 構造器 | 說明 |
| public | ✓ | ✓ | ✓ | ✓ | ✓ | 完全公開,跨包可見 |
| protected | ✗ (頂級) | ✗ | ✓ | ✓ | ✓ | 同包 + 子類可見 |
| default (包私有) | ✓ | ✓ | ✓ | ✓ | ✓ | 僅同包可見 |
| private | ✗ (頂級) | ✗ | ✓ | ✓ | ✓ | 僅本類可見 |
關鍵規則
- 頂級類只能
public 或 default
- 接口成員隱式
public static final (字段) / public abstract (方法)
- 構造器不可為
abstract/static/final/synchronized
- 局部變量只能用
final,不可用訪問修飾符
二、非訪問修飾符詳解
1. final —— 不可變契約
- 類:不可繼承(如
String、Math),編譯器可內聯優化
- 方法:不可重寫,可重載。編譯器嘗試內聯提升性能
- 變量:引用不可變(基本類型值不可變,引用類型指向不可變)。
static final 為編譯期常量,進入常量池
2. static —— 類級別屬性
- 字段:屬於類,全局唯一,生命周期隨類加載/卸載
- 方法:類方法,無
this,不可訪問實例成員,不可為 abstract
- 代碼塊:靜態初始化塊,類加載時按順序執行一次
- 內部類:靜態內部類不持有外部類引用,可獨立實例化
3. abstract —— 契約規範
- 類:不可實例化,供繼承。可包含非抽象方法
- 方法:無實現體,以分號結束。子類必須實現(除非子類也抽象)
- 禁用組合:
final(不可繼承/重寫衝突)、private(子類不可見)、static(無多態意義)
4. synchronized / volatile / transient / native / strictfp
| 修飾符 | 適用目標 | 核心作用 |
| synchronized | 方法、代碼塊 | 互斥鎖,保證可見性與原子性 |
| volatile | 字段 | 禁止指令重排,保證跨線程可見性 |
| transient | 字段 | 序列化時忽略該字段 |
| native | 方法 | 標記由 JNI 實現(C/C++) |
| strictfp | 類、方法 | 強制浮點運算符合 IEEE-754 標準 |
三、修飾符組合最佳實踐
- 常量定義:
public static final TYPE NAME = VALUE;(大寫下劃線命名)
- 工具類:
public final class Utils { private Utils() {} } 防止實例化與繼承
- 模板方法模式:
public final void template() { ... abstractStep(); } 鎖定流程骨架
- Builder 模式:構造器
private,靜態內部類 Builder 暴露構建 API
- 雙檢鎖單例:
private static volatile Instance INSTANCE; 保證發布安全
四、常見錯誤避坑指南
- ❌
public static final int[] ARR = {1,2,3}; → 數組內容可變,應用 Collections.unmodifiableList 或防御性拷貝
- ❌ 接口中定義
protected 方法 → 編譯錯誤,接口成員只能 public
- ❌
abstract private void method(); → 子類不可見無法實現
- ❌ 構造器加
static → 編譯錯誤,構造器屬於實例創建過程
總結
修飾符是 Java 封裝、繼承、多態機制的語法基石。精通各修飾符語義、約束與組合規則,能編寫出安全、清晰、可維護的代碼。建議配合 IDE 代碼檢查、SonarQube 規則庫持續規範團隊編碼風格。