Java 四大存取修飾符(Access Modifiers)是封裝性的核心機制,決定類別、欄位、方法、建構子對外部的可見性。掌握它們的權限邊界,是寫出高內聚、低耦合程式碼的基礎。本文以表格、圖解、實例全方位解析。
| 修飾符 | 同一類別 | 同一套件 | 子類別(不同套件) | 非子類別(不同套件) |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default (package-private) | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
記憶口訣:public 到處行、protected 留給兒子、default 只在自家、private 獨自藏。
package 宣告下的所有類別extends 繼承的類別,不限套件
// 基礎類別
package com.example.base;
public class Base {
public int publicField = 1;
protected int protectedField = 2;
int defaultField = 3; // package-private
private int privateField = 4;
public void publicMethod() {}
protected void protectedMethod() {}
void defaultMethod() {}
private void privateMethod() {}
}
// 同套件非子類別
package com.example.base;
public class SamePackage {
void test(Base b) {
b.publicMethod(); // ✅
b.protectedMethod(); // ✅
b.defaultMethod(); // ✅
// b.privateMethod(); // ❌ 編譯錯誤
}
}
// 不同套件子類別
package com.example.derived;
import com.example.base.Base;
public class Derived extends Base {
void test() {
publicMethod(); // ✅ 繼承而來
protectedMethod(); // ✅ 繼承而來
// defaultMethod(); // ❌ 不同套件不可見
// privateMethod(); // ❌ 私有不繼承
}
}
// 不同套件非子類別
package com.example.other;
import com.example.base.Base;
public class Other {
void test(Base b) {
b.publicMethod(); // ✅
// b.protectedMethod(); // ❌ 非子類別不可見
// b.defaultMethod(); // ❌
// b.privateMethod(); // ❌
}
}
| 修飾符 | 說明 |
|---|---|
| public | 任何地方可存取,檔名必須與類別名相同 |
| default | 同套件可存取,一個 .java 檔只能有一個 public 類別,可有多個 default 類別 |
注意:頂層類別不能使用 protected 或 private(巢狀類別除外)。
public 欄位(常數除外)| 誤區 | 正確觀念 |
|---|---|
| protected 等同「同套件 + 子類別」 | protected = 同套件 或 子類別(跨套件也可見) |
| 介面方法可用 protected | 介面方法隱含 public,不可加其他修飾符 |
| 子類別可繼承 private 方法 | private 成員不被繼承,子類別中可另寫同名方法但無關聯 |
| default 是關鍵字 | default 是不寫修飾符的預設行為,Java 8+ 介面預設方法才用 default 關鍵字 |
Java 9+ 引入模組系統,module-info.java 中的 exports、opens 會進一步限制跨模組存取,甚至比修飾符優先級更高。模組化專案請同時參考模組宣告。
熟練掌握四大修飾符,配合「最小權限原則」,即可設計出安全、可維護、易擴充的 Java 類別架構。