0

我有一个内部类(非静态),它在其初始化中使用对封闭类的引用。现在内部类会保留对封闭类的引用吗?

class Enclosing {
  class Inner {
    private final ABC innerField = outerField.computeSomething();
  }

  private final XYZ outerField = something();
}

更新

我非常清楚可以使用Enclosing.this.

但是,如果类不使用引用,编译后引用是否必须存在即使引用仅在初始化中使用,是否有必要?

它在哪里说内部类总是持有对外部类的引用?

4

4 回答 4

8

非静态嵌套类始终持有对封闭类的引用。Inner在您的示例中,您可以从as引用封闭类Enclosing.this

JLS 8.1.3“内部类和封闭实例”

“类 O 的直接内部类 C 的实例 i 与 O 的实例相关联,称为 i 的直接封闭实例。对象的直接封闭实例(如果有)在创建对象时确定( §15.9.2)。”

于 2012-10-30T19:00:59.973 回答
1

是的。内部类(或非静态嵌套类)就像外部类的任何其他实例成员一样,因此总是需要封闭类的引用。

于 2012-10-30T21:44:33.863 回答
0

它在哪里说内部类总是持有对外部类的引用?

同一个地方它定义了 Outer.this 语法。这种语法的存在就是引用的存在。没有任何迹象表明如果不使用它会被抑制。

于 2012-10-30T21:06:22.993 回答
-1

嵌套类有两种情况:

静态嵌套类。嵌套类不保留对外部类的引用。

非静态嵌套类。嵌套类确实保留了对外部类的引用。

扩展外部类的静态嵌套类的情况不如扩展外部类的非静态嵌套类有趣。

要记住的重要一点是,非静态嵌套类简称为内部类。

于 2012-10-30T19:03:30.800 回答