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

Java 内部类对象如何驻留在内存中?,java,inner-classes,Java,Inner Classes,Outer=新的Outer() 在堆上创建外部类的对象,引用变量指向该对象 如果我写的时候理解正确的话 Outer.Inner=Outer.new-Inner() internal类的对象在堆上创建,并且internal指向它。在heap中,我们有两个单独的对象,其中包含它们自己的实例变量 但是如果我写 Outer.internal=new Outer().new internal() 仍然会在堆上创建两个对象,一个用于外部,另一个用于内部。但是参照内部只能访问内部对象的成员。谁在引用堆上的外部

Outer=新的Outer()

在堆上创建
外部
类的
对象
,引用变量指向该对象

如果我写的时候理解正确的话

Outer.Inner=Outer.new-Inner()

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

但是如果我写

Outer.internal=new Outer().new internal()


仍然会在堆上创建两个
对象
,一个用于
外部
,另一个用于
内部
。但是参照
内部
只能访问
内部
对象的
成员。谁在引用堆上的外部
对象
?如果它没有被任何引用引用,那么它应该有资格进行垃圾收集,这将影响
内部
的使用

很自然,内部保持对它想要强引用的对象的强引用,就像它的另一半实例变量驻留在外部一样。

内部类的每个实例都保持对其外部类实例的引用。它是您在编写
Outer时得到的引用。它位于内部类的一个方法中。匿名
外部
实例将不符合垃圾收集的条件,除非与其关联的所有
内部
实例也符合垃圾收集的条件。

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

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

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$0
的包范围隐藏引用,类型为
Outer
——这就是我上面提到的引用。

所有内部类都是非静态的,否则它不会被称为内部类(它将被称为静态成员类)