内部类对象如何驻留在内存中?
问题内容:
Outer outer = new Outer();
一个Object
的Outer
类上堆和参考变量指向它创建。
如果我写的时候没看错
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$0
type 的包范围隐藏引用Outer
-这是我在上面讨论的引用。