Java 類級別僅支持兩種訪問權限:public 與默認(包私有,package-private)。類不能聲明為 private 或 protected(內部類除外)。本文通過雙包項目結構,實證類可見性在同包與跨包場景的具體規則。
lession3/
├── Lession3.java // 主類,嘗試訪問各類
├── PublicClassSamePackage.java // 同包 public 類
├── DefaultClassSamePackage.java // 同包默認類
└── otherpackage/
├── PublicClassOtherPackage.java // 不同包 public 類
└── DefaultClassOtherPackage.java // 不同包默認類
public class Lession3 {
public static void main(String[] args) {
// 同包 public 類
System.out.println(new PublicClassSamePackage().toString()); // ✅
// 同包默認類
System.out.println(new DefaultClassSamePackage().toString()); // ✅
// 不同包 public 類
System.out.println(new PublicClassOtherPackage().toString()); // ✅
// 不同包默認類
// System.out.println(new DefaultClassOtherPackage().toString()); // ❌ 編譯錯誤
}
}
相同package的公開類
相同package的默認類
其它package的公開類
取消註釋訪問 DefaultClassOtherPackage 的代碼,編譯器報錯:
DefaultClassOtherPackage is not visible原因:默認類僅在聲明包內可見,跨包不可見,甚至無法
import。實驗驗證清單
- 將默認類改為
public→ 編譯通過,可跨包訪問- 將同包
public類去掉修飾符 → 主類仍可訪問(同包不受影響)- 在同包新增類並使用 → 無論
public或默認,均可訪問- 在不同包新增類並使用 → 必須
public且import才可訪問- 自建新包引用 → 同理,僅
public類可跨包使用核心規則總結
場景 public 類 默認類 同包訪問 ✅ ✅ 跨包訪問 ✅ (需 import) ❌ 文件名要求 必須與類名一致 無強制要求(建議一致) 單文件數量 最多一個 public 類 可多個默認類 設計建議
- 公開 API:Controller、Service 接口、DTO、異常類 →
public- 內部實現:Impl 類、工具類、領域模型內部類 → 默認權限,隱藏在包內部
- 包設計原則:高內聚功能放同一包,利用默認權限封裝實現細節,僅暴露
public門面- 測試代碼:測試類置於同包(或
test同名包),可直接訪問默認類進行白盒測試理解類級訪問權限的「同包全開、跨包僅公」鐵律,配合合理的包劃分,是實現模塊化封裝、防止實現細節外洩的關鍵手段。