首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 內部類實例化語法 `this.new` 深度解析:宿主對象與內部類綁定機制

     編輯:程式設計綜合問答

代碼示例

public class MyClass {
    public void method1() {
        MyInterface iclass = this.new MyClassInner();
    }

    private class MyClassInner implements MyInterface { }
}

核心結論

this.new MyClassInner() 表示以外部類當前實例(this)為宿主對象,創建非靜態內部類 MyClassInner 的實例。

語法本質

  • 非靜態內部類實例不能獨立存在,必須綁定一個外部類實例。
  • 通用語法:外部類實例.new 內部類()。
  • 在外部類非靜態方法中,this 即當前外部類實例,故可簡寫為 this.new 內部類()。

內存模型圖解

外部類實例 (MyClass)          內部類實例
+-------------------+         +-------------------+
| fields...         |  1:N    | ref to outer (隱式)|
| method1()         |-------->| fields...         |
+-------------------+         +-------------------+
        ^                              ^
        | this                         | 外部類.this 引用
        +------------------------------+

實戰注意點

  1. 序列化陷阱:內部類實例序列化時會連帶序列化外部類實例,可能導致大對象圖、NotSerializableException。
  2. 內存洩漏:長生命周期的內部類實例(如 Handler、Listener)持有外部類引用,阻礙外部類被 GC,靜態內部類 + WeakReference 可解。
  3. 反射創建:Constructor c = MyClassInner.class.getDeclaredConstructor(MyClass.class); c.newInstance(outerInstance);

對比:靜態內部類

若內部類聲明為 static class MyStaticInner,則無需宿主對象,直接 new MyStaticInner() 即可,不持有外部類引用,更輕量、更安全。

掌握 this.new 的本質,是理解 Java 內部類機制、避免內存洩漏、正確序列化的關鍵一步。

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