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

Java 訪問權限控制全解析:public/protected/default/private 四層防線

     編輯:Java 綜合教學

Java 訪問權限控制全解析:public/protected/default/private 四層防線

封裝的核心是**訪問控制**,Java 提供四個層級,從寬到嚴:

修飾符同類同包子類(異包)非子類(異包)適用對象
public✓✓✓✓類、接口、成員、構造器
protected✓✓✓✗成員、構造器
default (無修飾符)✓✓✗✗類、接口、成員、構造器
private✓✗✗✗成員、構造器、內部類

一、類成員訪問權限詳解

1. public:公開 API

對所有代碼可見,構成類的**對外契約**。接口方法隱式 public。

2. protected:繼承專屬 + 包可見

  • 同包類可直接訪問。
  • 異包子類僅通過**繼承鏈**訪問(super.xxx 或直接 xxx),不能通過父類引用訪問。
  • 設計意圖:父類預留擴展點,不想暴露給無關類。

3. default (包私有):模塊內部協作

  • 同包內自由訪問,包外完全不可見。
  • 適用於「包級組件」內部協作,如同一模塊下的 Service/DAO 互調。
  • 無關鍵字,易被忽視,**建議在團隊規約中明確註釋** `/* package */`。

4. private:內部實現細節

  • 僅本類可見,連子類、同包類都不可見。
  • 典型用途:字段封裝(配合 Getter/Setter)、內部輔助方法、單例構造器私有化、構建器模式。

二、類級訪問權限

  • public class:公開類,文件名必須與類名一致,每個編譯單元最多一個。
  • default class:包私有類,輔助類、內部實現類,文件名無要求。
  • 類不能是 private/protected(頂級類),除非是**內部類**。

三、構造器私有化模式

// 單例:私有構造器 + 靜態工廠
public class Singleton {
    private Singleton() {}
    private static final Singleton INSTANCE = new Singleton();
    public static Singleton getInstance() { return INSTANCE; }
}

// 建造器:私有構造器 + 靜態內部 Builder
public class User {
    private final String name; private final int age;
    private User(Builder b) { this.name = b.name; this.age = b.age; }
    public static class Builder {
        private String name; private int age;
        public Builder name(String n) { this.name = n; return this; }
        public Builder age(int a) { this.age = a; return this; }
        public User build() { return new User(this); }
    }
}

四、接口與實現分離

  • 接口定義契約(public 方法)。
  • 實現類隱藏細節(private 字段/方法、default/package 輔助類)。
  • 客戶代碼依賴接口,編譯期綁定接口,運行期注入實現(DI 容器)。

五、編譯單元限制

  1. 最多一個 public class。
  2. public class 文件名必須同名(大小写敏感)。
  3. 無 public class 時文件名任意。

六、最佳實踐原則

  1. 最小權限原則:默認 private,需要時再放寬。
  2. 字段必私有:暴露行為而非數據。
  3. 繼承用 protected:預留擴展點,封鎖濫用。
  4. 包內協作用 default:模塊邊界清晰。
  5. 公開 API 用 public:謹慎設計,發布後不輕易變更。

訪問控制不是語法糖,而是**架構邊界的代碼表達**。

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