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
——这就是我上面提到的引用。所有内部类都是非静态的,否则它不会被称为内部类(它将被称为静态成员类)