Java 的存取修飾詞(public、protected、private)直接標註在**每個成員定義之前**,對該特定成員獨立生效。這與 C++「修飾詞管轄後續所有定義、直到下一個修飾詞」的區塊式機制截然不同。本文將快速對比兩者差異,並梳理四大存取層級的核心規則。
| 語言 | 機制 | 範例 |
|---|---|---|
| Java | **逐成員獨立標註** | private int a; public void f() {} — 各自獨立 |
| C++ | **區塊管轄** | private: int a; void f(); public: int b; — 修飾詞影響後續所有 |
Java 方式更細粒度、更不易因程式碼移動而意外改變存取層級。
| 修飾詞 | 關鍵字 | 同類別 | 同套件 | 子類別(跨套件) | 任意類別 | 適用對象 |
|---|---|---|---|---|---|---|
| public | public | ✓ | ✓ | ✓ | ✓ | 類別、介面、欄位、方法、建構子 |
| Protected | protected | ✓ | ✓ | ✓ | ✗ | 欄位、方法、建構子(類別不可) |
| Friendly | (無修飾詞) | ✓ | ✓ | ✗ | ✗ | 類別、介面、欄位、方法、建構子 |
| Private | private | ✓ | ✗ | ✗ | ✗ | 欄位、方法、建構子、巢狀類別 |
public:跨套件可見friendly (無修飾詞):僅同套件可見private 或 protected(巢狀類別除外)public class MyClass { // 類別修飾詞:public 或無
private int field; // 欄位修飾詞
protected void helper() {} // 方法修飾詞
public MyClass() {} // 建構子修飾詞
class Nested { } // 巢狂類別可用 private/protected
}
每個修飾詞**只管緊隨其後的那個定義**,互不干擾。這讓 Java 存取控制既精確又直觀。