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

Java 存取權限陷阱:protected 內部類跨包實例化失敗分析

     編輯:Java 相關知識

問題場景

package pac1;
public class Parent {
    protected class Inner { }  // protected 內部類
}

package pac2;
import pac1.Parent;
public class Child extends Parent {
    public static void main(String[] args) {
        Inner i = new Parent().new Inner();  // 編譯錯誤
    }
}

錯誤訊息:Inner() has protected access in pac1.Parent.Inner

根因分析

  • protected 修飾的是 建構子(預設與類別同權限)
  • Child 雖繼承 Parent,但 Child 與 Inner 不同包且無繼承關係
  • JDR 規範:protected 成員僅對同包或子類可見,且子類存取必須透過子類實例

解決方案

  1. 將 Inner 建構子改為 public(最簡單)
  2. 在 Parent 提供 public Inner createInner() { return new Inner(); } 工廠方法
  3. 將 Inner 移至獨立 public 類別

存取權限速查表

修飾符同類同包子類(異包)非子類(異包)
private✓✗✗✗
default✓✓✗✗
protected✓✓✓(僅透過子類實例)✗
public✓✓✓✓

核心心法

「protected 不等於『子類隨便用』,而是『子類透過繼承鏈用』」

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