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

Java 內部類核心機制:隱式外部引用與訪問權限全解析

     編輯:Java 相關知識

內部類 vs C++ 嵌套類:本質區別

C++ 嵌套類僅是命名空間管理,無外部引用、無默認訪問權限。Java 內部類:

  • 持有隱式引用指向創建它的外部類實例。
  • 擁有外部類所有成員的訪問權限(含 private)。

Sequence + Selector 經典示例

public class Sequence {
    private Object[] o; // 外部私有字段
    private int next = 0;
    public void add(Object x) { if (next < o.length) o[next++] = x; }

    private class SSelector implements Selector { // 實現外部接口
        int i = 0;
        public boolean end() { return i == o.length; } // 直接訪問 o.length
        public Object current() { return o[i]; }       // 直接訪問 o[i]
        public void next() { if (i < o.length) i++; }
    }
    public Selector getSelector() { return new SSelector(); }
}

SSelector 方法直接使用 o,無需參數傳遞、無需 Sequence.this.o 顯式限定。編譯器自動注入外部引用完成綁定。

底層實現原理

  1. 內部類構造器隱藏參數:OuterClass outerRef。
  2. 創建內部實例時:new SSelector() 實為 new SSelector(this)。
  3. 內部方法訪問外部成員時:隱式轉為 outerRef.member。
  4. 編譯器全自動處理,開發者無感知。

編譯器強制約束

無外部實例無法創建非靜態內部類實例。靜態方法中直接 new Inner() 會編譯報錯(因無 this)。

對比 C++

C++ 嵌套類:僅名字隱藏,無引用,無特權訪問。
Java 內部類:隱式引用 + 完全訪問權 = 外部類的「非靜態成員」。

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