Java 提供四級訪問權限修飾符(private、默認、protected、public),分別控制類、屬性、方法、構造器對外部代碼的可見性。本文通過雙包結構項目實戰,詳細演示各權限在同包類、不同包普通類、不同包子類中的訪問矩陣,並附帶編譯錯誤現場分析。
| 修飾符 | 同一類 | 同包其他類 | 不同包子類 | 不同包非子類 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
| 默認(無修飾符) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
lession4/
├── Lession4.java // 主類,定義四種權限的實例/靜態屬性
├── TestSamePackage.java // 同包類,驗證非 private 可訪問
└── otherpackage/
├── TestSubClassOtherPackage.java // 不同包子類,驗證 protected/public 可訪問
└── TestOtherPackage.java // 不同包非子類,驗證僅 public 可訪問
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; }
}
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 不可見
}
public class TestSubClassOtherPackage extends Lession4 {
public void test() {
num3 = 3; num4 = 4; // ✅ 繼承獲得 protected/public 實例屬性
num13 = 13; num14 = 14; // ✅ 繼承獲得 protected/public 靜態屬性
// num1, num2, num11, num12 ❌ 不可見
}
}
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)僅在方法內部可見,無權限修飾符概念最佳實踐原則
- 封裛優先:屬性默認
private,通過public/protectedgetter/setter 受控暴露- 繼承設計:需子類直接訪問的字段用
protected,否則提供protected方法- 包邊界:同包協作類用默認權限,公開 API 必須
public- 靜態常量:
public static final定義編譯期常量,命名全大寫下劃線分隔熟練掌握四級權限在類、屬性、方法、構造器上的具體語義與跨包訪問規則,是編寫安全、可維護、符合封裝原則 Java 代碼的必修課。