Java 内部类必须有对封闭类的引用吗?

Java 内部类必须有对封闭类的引用吗?,java,inner-classes,Java,Inner Classes,我有一个内部类(非静态),它在初始化时使用对封闭类的引用。内部类现在会保留对封闭类的引用吗 class Enclosing { class Inner { private final ABC innerField = outerField.computeSomething(); } private final XYZ outerField = something(); } 更新 我非常清楚,可以用括起来引用外部类。这 但是,如果类不使用引用,那么编译后引用必须在那里吗?即

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

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

  private final XYZ outerField = something();
}
更新

我非常清楚,可以用
括起来引用外部类。这

但是,如果类不使用引用,那么编译后引用必须在那里吗?即使引用仅用于初始化,也有必要吗

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

非静态嵌套类总是持有对封闭类的引用。在您的示例中,您可以将
internal
中的封闭类引用为
enclosuring

:

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


嵌套类有两种情况:

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

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

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

需要记住的一点是,非静态嵌套类被简单地称为内部类

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


在公园里。这个语法的存在就是引用的存在。没有任何迹象表明,如果不使用,它将被抑制。

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

它在哪里说它总是保存引用——即使您从未使用过它?为了便于参考,我浏览了JLS 8.1.3“内部类和封闭实例”我在任何地方都看不到,所有的内部类都是非静态的。请参阅JLS。@EJP感谢您的澄清。我不知道“内部”和“嵌套”在术语上有区别。答案已相应更新…@Michaeldearduff您在正确的部分中…请参阅“类O的直接内部类C的实例i与O的实例关联,称为i的直接封闭实例。对象的直接封闭实例(如果有)在创建对象时确定(§15.9.2)。“如果不使用引用,它在哪里说它总是保留引用?内部类根据定义是非静态的。参见JLS。有两种嵌套类。答案是术语上的矛盾。@当然,Java语言规范中的MichaelDeardeuff。所有内部类根据定义都是非静态的。