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

Pan*_*kaj 6 java inner-classes

Outer outer = new Outer();

一个ObjectOuter类是在堆中创建和参考变量指向它.

如果我在写作时就明白了

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

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

但如果我写

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

仍然Object会在堆上创建两个for for Outer和other for Inner.但参考,inner只有Inner Object's成员可以访问.谁在指Object堆外?如果它没有被任何引用引用,那么它应该有资格进行垃圾收集,这会影响其使用inner.

Erw*_*idt 10

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

要查看此操作,请获取此源代码并进行编译:

public class Outer {
    public class Inner {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

你会看到有一个名为this$0type 的包范围隐藏引用Outer- 这是我上面谈到的引用.