Java 提供豐富的修飾符控制類、方法、變量的可見性、生命周期與行為。本文系統梳理 4 種訪問修飾符、6 種非訪問修飾符的語義、作用目標、組合規則與最佳實踐。
| 修飾符 | 同類 | 同包 | 子類(異包) | 非子類(異包) |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
default (包私有) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
口訣:private < default < protected < public (可見性遞增)
| 修飾符 | 頂層類 | 內部類 | 說明 |
|---|---|---|---|
public | ✅ | ✅ | 公共訪問 |
default | ✅ | ✅ | 包內訪問 |
abstract | ✅ | ✅ | 不可實例化,可含抽象方法 |
final | ✅ | ✅ | 不可被繼承 |
static | ❌ | ✅ | 僅修飾靜態內部類 |
protected/private | ❌ | ✅ | 僅修飾成員內部類 |
String, Integer)public static finalClassName.field 訪問this,不可訪問實例成員,ClassName.method() 調用final、private、static、native、synchronizedthis,靜態方法鎖 Class 對象synchronized(obj) { } 精確控制鎖範圍Object.hashCode(), System.arraycopy(), Thread.start()| 目標 | 允許組合 | 禁止組合 |
|---|---|---|
| 類 | public/abstract/final + default | static/protected/private/synchronized/native/volatile/transient |
| 方法 | 訪問修飾符 + static/final/abstract/synchronized/native | abstract+final, abstract+private, abstract+static, abstract+synchronized, abstract+native |
| 字段 | 訪問修飾符 + static/final/transient/volatile | final+volatile (語義衝突), static+transient (無意義) |
| 局部變量 | 僅 final | 其餘所有 |
| 構造器 | 訪問修飾符 | static/final/abstract/synchronized/native/volatile/transient |
private,按需放寬finalvolatile + synchronized 或並發包transient,實現 serialVersionUID