Outer outer = new Outer();
在堆上创建Object
Outer
类,并且引用变量指向它。
如果我在写作时明白这一点
Outer.Inner inner=outer.new Inner();
在堆上创建Inner
类的对象,inner
指向它。在堆中,我们有两个独立的对象,它们包含自己的实例变量。
但如果我写
Outer.Inner inner=new Outer().new Inner();
还会在{1}}的第一个堆上创建两个Object
,为Outer
创建另一个Inner
。但是,参考inner
只有Inner
Object's
成员才能访问。谁指的是堆上的外Object
?如果它没有被任何引用引用,那么它应该有资格进行垃圾收集,这会影响inner
的使用。
答案 0 :(得分:9)
内部类包含对其外部类实例的隐藏引用。如果没有其他引用,那隐藏引用会使外部类实例保持活动状态。
要查看此操作,请获取此源代码并进行编译:
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
的包范围隐藏引用 - 这是我上面谈到的引用。
答案 1 :(得分:1)
内部类的每个实例都包含对其外部类的实例的引用。它是您在其中一个内部类方法中编写Outer.this
时所获得的参考。匿名Outer
实例不符合垃圾收集条件,除非与其关联的所有Inner
实例也有资格进行垃圾收集。
答案 2 :(得分:0)
当然,内部强调对它想要强引用的事物的强引用 - 就像它的另一半实例变量一样,它们位于外部。