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

时间:2012-10-30 18:58:59

标签: java inner-classes

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

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

  private final XYZ outerField = something();
}

更新

我非常清楚可以使用Enclosing.this引用外部类。

但是,如果类没有使用引用,那么编译后必须引用?即使引用仅用于初始化,是否有必要?

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

4 个答案:

答案 0 :(得分:7)

非静态嵌套类始终包含对封闭类的引用。在您的示例中,您可以将Inner中的封闭类引用为Enclosing.this

JLS 8.1.3 "Inner classes and Enclosing Instances"

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

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

same place it defines the Outer.this syntax中。这种语法的存在是引用的存在。没有任何迹象表明如果不使用它会被抑制。

答案 3 :(得分:-1)

有两种嵌套类:

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

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

扩展外部类的静态嵌套类的情况并不像     非静态嵌套类扩展外部类。

要记住的一件重要事情是非静态嵌套类简称为内部类。