Java 的存取修飾符(public、protected、default、private)常用於類別、成員變數、方法。但它們的適用範圍不止於此。本文整理完整修飾目標,並解答「一個類別能混用多種修飾符嗎?」
| 元素 | 可用修飾符 | 說明 |
|---|---|---|
| 頂層類別 | public、default | 檔案名需與 public 類別同名;default 僅同套件可見 |
| 成員類別(巢狀類別) | public、protected、default、private | 內部類別可用 private 封裝 |
| 介面 | public、default | 介面成員隱含 public static final / public abstract |
| 建構子 | public、protected、default、private | private 建構子用於單例、工廠模式 |
| 成員變數(欄位) | 四種皆可 | 包含實例與靜態變數 |
| 方法 | 四種皆可 | 包含實例、靜態、預設、抽象方法 |
| 區域變數 | 不可使用 | 區域變數無存取修飾符,生命週期侷限於區塊 |
當然可以,而且是常態。 一個設計良好的類別,通常會根據封裝需求,對不同成員給予不同可見性:
public class OrderService {
// 公共 API
public void submitOrder(Order order) { ... }
// 子類可覆寫的擴展點
protected void validateOrder(Order order) { ... }
// 同套件輔助類可用
void notifyWarehouse(Order order) { ... } // default
// 完全內部實作細節
private void calculateDiscount(Order order) { ... }
// 內部靜態常數
private static final int MAX_RETRY = 3;
}
| 修飾符 | 同類 | 同套件子類 | 同套件非子類 | 不同套件子類 | 不同套件非子類 |
|---|---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✓ | ✗ |
default | ✓ | ✓ | ✓ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ | ✗ |
private,需要時再放寬。public 介面,實作細節 private。protected。熟練掌握各修飾符的適用對象與能見性,是寫出高內聚、低耦合 Java 程式碼的基礎功力。