内部类对象如何驻留在内存中?


问题内容

Outer outer = new Outer();

一个ObjectOuter类上堆和参考变量指向它创建。

如果我写的时候没看错

Outer.Inner inner=outer.new Inner();

Inner类的对象在堆上创建并inner指向它。在堆中,我们有两个单独的对象,其中包含它们自己的实例变量。

但是如果我写

Outer.Inner inner=new Outer().new Inner();

还有两个Object将在堆上创建,一个用于Outer,另一个用于Inner。但inner仅提供参考Inner
Object's即可。谁指的Object是堆外层?如果没有任何引用引用它,那么它应该有资格进行垃圾回收,这将影响的使用inner


问题答案:

内部类包含对其外部类实例的隐藏引用。如果没有其他引用,则该隐藏引用使外部类实例保持活动状态。

要查看实际效果,请获取以下源代码并进行编译:

public class Outer {
    public class Inner {
    }
}

现在使用java类检查工具javap查看隐藏的参考:

$ javap -p Outer\$Inner
Compiled from "Outer.java"
public class Outer$Inner {
  final Outer this$0;
  public Outer$Inner(Outer);
}

您将看到有一个名为this$0type 的包范围隐藏引用Outer-这是我在上面讨论的引用。