首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 存取修飾符詳細解析:public、protected、default、private

     編輯:Java 相關知識

四大修飾符可見性對照表

修飾符同一類別同一套件子類別(不同套件)非子類別(不同套件)
public✅✅✅✅
protected✅✅✅❌
default (無修飾符)✅✅❌❌
private✅❌❌❌

關鍵細節:protected 的「子類別」陷阱

// 父類別
package com.parent;
public class Parent {
    protected int value = 100;
}

// 子類別 (不同套件)
package com.child;
public class Child extends Parent {
    public void access() {
        System.out.println(this.value);    // ✅ 繼承的欄位,可直接存取
        System.out.println(super.value);   // ✅
        
        Parent p = new Parent();
        // System.out.println(p.value);    // ❌ 編譯錯誤!非子類別實例不可存取
    }
}

// 非子類別 (同套件)
package com.parent;
public class Neighbor {
    public void test() {
        Parent p = new Parent();
        System.out.println(p.value); // ✅ 同套件可存取 protected
    }
}

核心規則:protected 允許**子類別透過繼承**存取,以及**同套件任何類別**存取。**但子類別不能透過父類別實例引用存取 protected 成員** (除非同套件)。

類別層級修飾符 (頂層類別)

修飾符說明
public任何地方可存取,一個 .java 檔只能有一個 public 類別,檔名必須同名
default僅同套件可存取,檔名可任意

⚠️ 頂層類別不能用 protected/private (內部類別除外)。

最佳實踐原則

  1. 封裝性優先:欄位預設 private,提供 public getter/setter
  2. API 設計:對外介面用 public,內部實作細節 private
  3. 繼承擴展:需給子類別覆寫/存取的方法/欄位用 protected
  4. 套件內協作:工具類、DTO、包私有實作用 default
  5. 避免 protected 欄位:破壞封裝,改用 private + protected getter/setter

模組化時代 (Java 9+)

// module-info.java
module com.example.app {
    exports com.example.api;        // 公開 API 套件
    // com.example.impl 不導出,僅模組內部可見
}
  • public 類別若在未導出套件,模組外**仍不可存取** (編譯/運行雙重檢查)
  • opens 允許反射存取私有成員 (供框架如 Spring/Hibernate 用)
  • 模組系統在編譯期、執行期**強制封裝**,比傳統修飾符更強

常見面試題

  1. Q:介面中的方法預設修飾符?A:public abstract (Java 8 前);Java 9+ 允許 private 方法
  2. Q:介面欄位預設?A:public static final
  3. Q:建構子可用修飾符?A:四大修飾符皆可,private 用於單例/工廠模式
  4. Q:覆寫方法修飾符規則?A:**不能縮小**可見性 (public → protected ❌),可擴大或相同

總結

掌握 public > protected > default > private 可見性遞減順序,理解 protected 的「繼承存取」與「套件存取」雙重語意,配合模組系統 (exports/opens) 實現**真正的強封裝**,是設計健壯 Java API 的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved