我有一个内部类(非静态),它在初始化时使用对封闭类的引用。内部类现在会保留对封闭类的引用吗?
class Enclosing {
class Inner {
private final ABC innerField = outerField.computeSomething();
}
private final XYZ outerField = something();
}
更新
我非常清楚可以使用Enclosing.this
引用外部类。
但是,如果类没有使用引用,那么编译后必须引用?即使引用仅用于初始化,是否有必要?
它在哪里说内部类总是包含对外部类的引用?
答案 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)
有两种嵌套类:
静态嵌套类。嵌套类不保留对外层的引用。
非静态嵌套类。嵌套类确实保留了对外部类的引用。
扩展外部类的静态嵌套类的情况并不像 非静态嵌套类扩展外部类。
要记住的一件重要事情是非静态嵌套类简称为内部类。