【问题标题】:How inner class object resides in memory?内部类对象如何驻留在内存中?
【发布时间】:2015-06-18 02:22:57
【问题描述】:

Outer outer = new Outer();

Outer 的一个 Object 类在堆上创建,并且引用变量指向它。

如果我写的时候理解正确

Outer.Inner inner=outer.new Inner();

Inner 类的对象在堆上创建,inner 指向它。在堆中,我们有两个独立的对象,它们包含自己的实例变量。

但如果我写

Outer.Inner inner=new Outer().new Inner();

仍然会在堆上创建两个Object,一个用于Outer,另一个用于Inner。但是参考inner 只有Inner Object's 成员是可访问的。谁指的是堆上的外部Object?如果它没有被任何引用引用,那么它应该有资格进行垃圾收集,这将影响inner 的使用。

【问题讨论】:

    标签: java inner-classes


    【解决方案1】:

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

    要查看实际情况,请获取此源代码并编译它:

    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 - 这是我在上面谈到的引用。

    【讨论】:

      【解决方案2】:

      自然,inner 会保留它想要强引用的事物的强引用 - 就像它驻留在 Outer 中的另一半实例变量一样。

      【讨论】:

        【解决方案3】:

        内部类的每个实例都包含对其外部类实例的引用。这是您在内部类的方法之一中编写Outer.this 时获得的参考。匿名 Outer 实例将不符合垃圾回收条件,除非与之关联的所有 Inner 实例也符合垃圾回收条件。

        【讨论】:

        • 所有内部类都是非静态的,否则就不能称为内部类(它会被称为静态成员类)
        猜你喜欢
        • 2016-08-30
        • 2011-07-01
        • 2015-02-17
        • 1970-01-01
        • 2020-03-02
        • 1970-01-01
        • 2018-11-29
        • 2013-11-10
        • 1970-01-01
        相关资源
        最近更新 更多