頂級類若為 private,任何其他類均不可見,無法實例化、繼承、引用,喪失存在意義。(內部類除外)
假設類 A 為 protected,類 B 在不同包:
B 訪問 A 的前提:B 是 A 的子類B 成為 A 子類的前提:B 能訪問 A形成循環依賴,無法打破。因此頂級類只能是 public 或 default(包私有)。
接口定義契約,供異包類實現。分析各修飾符:
方法 private → 任何實現類不可見 → 無法實現 → 違背接口目的。
假設 public interface I 有 protected void m():
public class C implements I 實現 m() 仍為 protectedD 調用:C c = new C(); c.m(); ✅I i = new C(); i.m(); ❌(protected 不對異包接口引用可見)失去「統一接口、面向抽象」核心價值。
public interface I 有 default void m() → 異包類實現時方法不可見 → 編譯錯誤。
default interface I { default void m(); } 同包內可實現,但為簡化規則、避免「public 接口不能用、default 接口能用」的認知負擔,統一禁止。
public abstractdefault void m()、靜態方法 static void m() 也必須 public| 修飾符 | 同類 | 同包 | 子類(異包) | 異包無關類 |
|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ✅ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| private | ✅ | ❌ | ❌ | ❌ |
private,按需放寬public 契約protected 僅用於「設計為被繼承」的類成員default 限制在包內協作,模塊化利器理解修飾符背後的「可見性邏輯與設計意圖」,比死記表格更能指導實際架構決策。