首頁
編程語言
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✓✓✓✓對外公開 API
protected✓✓✓✗繼承體系共享
default (無)✓✓✗✗包級內聚
private✓✗✗✗內部實現隱藏

原則:訪問權限越小,封裝性越強,系統越穩定。

二、代碼實驗驗證

實驗結構

com.demo.test1
├── Person.java      // 基類
├── Student.java     // 同包類
└── Teacher.java     // 子類

com.demo.test2
└── Parents.java     // 異包無關類

1. public 測試

// Person.java
public class Person {
    public String uname = "王五";
    public void introduceMyself() { System.out.println(uname); }
}

// Student.java (同包)
public class Student {
    Person p = new Person();
    public void test() { System.out.println(p.uname); } // ✓ 可訪問
}

// Teacher.java (子類)
public class Teacher extends Person {
    public void test1() { System.out.println(new Person().uname); } // ✓ 可訪問
}

// Parents.java (異包)
public class Parents {
    Person p = new Person();
    public void test2() { System.out.println(p.uname); } // ✓ 可訪問
}

結果:四個位置全部訪問成功。

2. protected 測試

將 uname 改為 protected:

// Person.java
protected String uname = "王五";

結果:Parents 編譯報錯 The field Person.uname is not visible,其餘三處正常。

結論:protected 允許同包 + 子類(含異包子類),禁止無關異包類。

3. private 測試

將 uname 改為 private:

// Person.java
private String uname = "王五";
// 必須提供 getter/setter
public String getUname() { return uname; }
public void setUname(String uname) { this.uname = uname; }

結果:只有 Person 內部可直接訪問,外部必須通過 getter/setter。

4. default (包私有) 測試

去掉修飾符:

// Person.java
String uname = "王五"; // default

結果:Student 可訪問,Teacher(異包子類)和 Parents 均報錯不可見。

結論:default 僅限同包可見,甚至繼承關系跨包也不可見。

三、設計哲學與最佳實踐

為什麼需要訪問控制?

  1. 保護不變量:防止客戶端代碼破壞對象內部一致性
  2. 降低耦合:隱藏實現細節,僅暴露穩定接口
  3. 演進自由:內部重構不影響外部調用者

選擇指南

  • private:默認選擇,所有字段、內部輔助方法優先私有
  • default:包內協作類、包級工具方法
  • protected:設計給子類覆寫/調用的模板方法、鉤子方法
  • public:對外契約 API、構造器、核心業務方法

常見誤區

誤區正確認知
字段設為 public 方便訪問破壞封裝,改用 private + getter/setter
protected 僅用於繼承同包類也可訪問,不限於子類
default 是「預設公開」default 是「包私有」,比 protected 更嚴格
接口方法可聲明 protected接口方法隱式 public,不可加其他修飾符

四、繼承中的訪問規則

  • 子類覆寫方法:權限只能擴大不能縮小(父 protected → 子 public ✓;父 public → 子 protected ✗)
  • 構造器無法繼承,但子類構造器必須調用父類構造器(super())
  • 父類 private 成員:子類不可見,但可通過父類 public/protected 方法間接訪問

掌握訪問修飾符,就是掌握了「什麼該藏、什麼該露、給誰看」的架構設計權力。

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