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

Java 訪問權限控制完全指南:封裝與解耦的核心機制

     編輯:Java 相關知識

在 Java 中,所有類、接口、字段、方法、構造器都受訪問權限控制。權限層級從大到小依次為:public > protected > 包訪問權限(默認,無關鍵字) > private。合理使用權限修飾符是實現封裝、隱藏實現細節、降低耦合的關鍵。

一、類成員的四種訪問途徑

  1. public:任何地方均可訪問
  2. 包訪問權限:同一包內的其他類可訪問
  3. protected:同包訪問 + 子類繼承訪問(即使跨包)
  4. 提供訪問器/變異器方法:間接讀寫私有字段

二、權限修飾符深度解析

1. 包訪問權限——包內協作的紐帶

無關鍵字修飾即為包訪問權限。同包類之間可自由互訪,外包類視為 private。這將功能相關的類組合成內聚模塊。

注意:無包聲明的類屬於默認包,同目錄下無包聲明的類互享包訪問權限。

// Cake.java 與 Pie.java 同目錄、無包聲明
class Pie { void f() { System.out.println("Pie.f()"); } }
public class Cake {
    public static void main(String[] args) {
        new Pie().f(); // 輸出:Pie.f()
    }
}

2. public——接口契約的公開聲明

public 成員對所有人可見,構成類對外的 API 契約。設計時應謹慎暴露,避免內部實現細節洩露為公共接口。

3. private——實現細節的鐵幕

private 成員僅當前類可訪問,連同包、子類均不可見。核心用途:

  • 控制對象創建(如單例模式、構造器私有化)
  • 隱藏內部數據結構與輔助方法
  • 防止外部破壞類的不變約束
class Sundae {
    private Sundae() {} // 禁止外部直接構造
    static Sundae makeASundae() { return new Sundae(); } // 工廠方法控制創建
}
public class IceCream {
    public static void main(String[] args) {
        Sundae x = Sundae.makeASundae(); // 僅能通過靜態工廠獲取實例
    }
}

陷阱提醒:某對象引用為 private 不代表其他對象無法持有該對象的 public 引用(引用傳遞特性)。

4. protected——繼承體系的專屬通道

protected = 包訪問權限 + 子類繼承訪問(跨包也可)。適用於:基類設計者希望特定成員對派生類開放,但對外部類隱藏。

三、接口與實現分離:封裝的本質

訪問控制將「客戶端可用」與「內部實現」劃清界限,雙重意義:

  1. 建立清晰的客戶端使用邊界,防止誤用內部機制
  2. 分離接口與實現,支持實現替換不影響調用者

將數據與方法封裝進類、隱藏具體實現,統稱封裝。

四、類級訪問權限

頂層類只能是 public 或包訪問權限(不可 private/protected,內部類除外)。

  • public class:文件名必須與類名完全一致(含大小寫),每個編譯單元僅一個
  • 包訪問權限類:文件名任意,編譯單元可無 public 類

阻止實例化的替代方案:私有構造器

// 方案一:靜態工廠方法
class Soup1 {
    private Soup1() {}
    public static Soup1 makeSoup() { return new Soup1(); }
}

// 方案二:單例模式
class Soup2 {
    private Soup2() {}
    private static Soup2 ps1 = new Soup2();
    public static Soup2 access() { return ps1; }
    public void f() {}
}

public class Lunch {
    void testPrivate() { /* new Soup1(); 編譯錯誤 */ }
    void testSingleton() { Soup2.access().f(); }
}

五、總結:權限選擇原則

  • 優先最小權限原則:默認 private,按需放寬
  • 字段盡量 private,通過公共方法訪問(保留驗證/擴展彈性)
  • 僅當確需構成公共契約時使用 public
  • protected 僅用於設計繼承體系時的模板方法/鉤子方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved