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

时间:2015-06-18 02:22:57

标签: java inner-classes

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的使用。

3 个答案:

答案 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)

当然,内部强调对它想要强引用的事物的强引用 - 就像它的另一半实例变量一样,它们位于外部。