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

How inner class object resides in memory?

Outer outer = new Outer();

在堆上创建了 Outer class 的 Object 并且引用变量指向它。

如果我写的时候没看错的话

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

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

但是如果我写

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

仍然有两个 Object 会在堆上为 Outer 创建,另一个为 Inner。但是参考 inner 只有 Inner Object's 成员可以访问。谁指的是堆上的外部Object?如果它没有被任何引用引用,那么它应该符合垃圾收集的条件,这将影响 inner 的使用。

自然地,inner 会保留它想要强引用的事物的强引用——就像它的另一半实例变量驻留在 Outer 中一样。

内部 class 的每个实例都持有对其外部 class 实例的引用。这是您在内部 class 方法之一中编写 Outer.this 时获得的参考。匿名 Outer 实例将不符合垃圾回收条件,除非与其关联的所有 Inner 实例也符合垃圾回收条件。

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

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

public class Outer {
    public class Inner {
    }
}

现在使用javaclass检查工具javap查看隐藏参考:

$ javap -p Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner {
  final Outer this[=11=];
  public Outer$Inner(Outer);
}

您会看到有一个名为 this[=13=] 的包范围隐藏引用,类型为 Outer - 这就是我在上面谈到的引用。