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

Java 訪問權限修飾符完整指南:類、屬性、方法的四級權限控制與跨包訪問規則

     編輯:Java 相關知識

Java 提供四級訪問權限修飾符(private、默認、protected、public),分別控制類、屬性、方法、構造器對外部代碼的可見性。本文通過雙包結構項目實戰,詳細演示各權限在同包類、不同包普通類、不同包子類中的訪問矩陣,並附帶編譯錯誤現場分析。

權限修飾符速查表

修飾符同一類同包其他類不同包子類不同包非子類
private✅❌❌❌
默認(無修飾符)✅✅❌❌
protected✅✅✅❌
public✅✅✅✅

實戰項目結構

lession4/
├── Lession4.java                    // 主類,定義四種權限的實例/靜態屬性
├── TestSamePackage.java             // 同包類,驗證非 private 可訪問
└── otherpackage/
    ├── TestSubClassOtherPackage.java   // 不同包子類,驗證 protected/public 可訪問
    └── TestOtherPackage.java           // 不同包非子類,驗證僅 public 可訪問

屬性訪問驗證代碼片段

主類定義(Lession4.java)

public class Lession4 {
    // 實例屬性
    private int num1 = 1;
    int num2 = 2;                    // 默認
    protected int num3 = 3;
    public int num4 = 4;

    // 靜態屬性
    private static int num11 = 1;
    static int num12 = 12;
    protected static int num13 = 13;
    public static int num14 = 14;

    // 靜態方法只能訪問靜態屬性
    public static void testStatic() { num11=11; num12=12; num13=13; num14=14; }

    // 實例方法可訪問所有屬性
    public void testInstance() { num1=1; num2=2; num3=3; num4=4; num11=11; num12=12; num13=13; num14=14; }
}

同包類訪問(TestSamePackage.java)

public void test() {
    Lession4 l = new Lession4();
    l.num2 = 2; l.num3 = 3; l.num4 = 4;      // ✅ 非 private 實例屬性
    l.num12 = 12; l.num13 = 13; l.num14 = 14; // ✅ 非 private 靜態屬性
    // l.num1 = 1; // ❌ 編譯錯誤:private 不可見
}

不同包子類訪問(TestSubClassOtherPackage.java)


public class TestSubClassOtherPackage extends Lession4 {
    public void test() {
        num3 = 3; num4 = 4;        // ✅ 繼承獲得 protected/public 實例屬性
        num13 = 13; num14 = 14;    // ✅ 繼承獲得 protected/public 靜態屬性
        // num1, num2, num11, num12 ❌ 不可見
    }
}

不同包非子類訪問(TestOtherPackage.java)


public void test() {
    Lession4 l = new Lession4();
    l.num4 = 4;       // ✅ 僅 public 實例屬性
    l.num14 = 14;     // ✅ 僅 public 靜態屬性
}

編譯錯誤現場:嘗試訪問私有屬性

在 TestSamePackage 中取消註釋 lession4.num1=1;,編譯器報錯:

num1 has private access in lession4.Lession4

錯誤提示明確指出:私有成員僅在聲明類內部可見,同包類亦不可訪問。

靜態與實例上下文的訪問差異

  • 靜態方法(testStatic)僅能訪問靜態屬性(num11~num14),嘗試訪問實例屬性(num1~num4)編譯報錯 non-static variable cannot be referenced from a static context
  • 實例方法(testInstance)可同時訪問實例與靜態屬性
  • 方法局部變量(num21、num31)僅在方法內部可見,無權限修飾符概念

最佳實踐原則

  1. 封裛優先:屬性默認 private,通過 public/protected getter/setter 受控暴露
  2. 繼承設計:需子類直接訪問的字段用 protected,否則提供 protected 方法
  3. 包邊界:同包協作類用默認權限,公開 API 必須 public
  4. 靜態常量:public static final 定義編譯期常量,命名全大寫下劃線分隔

熟練掌握四級權限在類、屬性、方法、構造器上的具體語義與跨包訪問規則,是編寫安全、可維護、符合封裝原則 Java 代碼的必修課。

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