2012-10-30 39 views
0

我有一个内部类(非静态),它在初始化时使用对封闭类的引用。内部类是否保持对封闭类的引用?必须内部类有对封闭类的引用吗?

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

    private final XYZ outerField = something(); 
} 

UPDATE

我非常清楚,一个可以参考外类Enclosing.this

但是,如果该类不使用引用,必须引用在编译后有吗?即使参考仅用于初始化,是否有必要?

它说什么内部类总是持有对外部类的引用?

回答

7

非静态嵌套类总是持有对封闭类的引用。在你的例子中,你可以参考Inner的封闭类Enclosing.this

JLS 8.1.3 "Inner classes and Enclosing Instances"

“的我的一类的O的直接内部类C的带O的实例相关联,被称为我的立即封闭实例立即封装的对象的实例的实例。 ,如果有的话,是在创建对象时确定的(第15.9.2节)。“

+0

它说的地方*永远*拥有参考 - 即使你从不使用它? –

+0

仅供参考,我正在浏览JLS 8.1.3“内部类和外部实例”,但我没有在任何地方看到http://docs.oracle.com/javase/specs/jls/se7/html/jls -8.html#jls-8.1.3 –

+0

所有内部类都是非静态的。请参阅JLS。 – EJP

-1

有嵌套类的两种情况:

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

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

扩展外层类的静态嵌套类的情况并不像 扩展外层类的非静态嵌套类那么有趣。

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

+0

它在哪里说*总是*保持一个参考,如果它不被使用? –

+0

根据定义,内部类是非静态的。请参阅JLS。有两种* nested *类。答案是矛盾的。 – EJP

0

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

same place it defines the Outer.this syntax。这个语法的存在就是参考的存在。没有任何迹象表明,如果不使用它,它会被压制。

+0

这个定义在哪里? –

+0

@MichaelDeardeuff当然,在Java语言规范中。 – EJP

+0

@downvoter热爱你的工作。对JLS有问题? – EJP

1

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

+0

根据定义,所有内部类都是非静态的。 – EJP