所有疯狂的Java范围界定规则都使我垂头丧气,而公共静态无效的废话无济于事。到目前为止,我所使用的所有编程语言都是词法作用域或它的某种近似,而没有任何访问修饰符,即内部填充物捕获外部填充物,只要内部填充物存在就可以访问外部填充物。

那么,如何理解Java内部类的作用域规则?它们是否可以访问在外部类中声明的变量,或者由于所有公共静态私有事物在周围徘徊,我是否有必要担心一些奇怪的情况?

最佳答案

静态嵌套类1与外部类完全相同,不同之处在于它们可以访问外部类的所有成员,而与访问限定符无关。它们与外部类的任何实例分开存在,因此需要引用一个实例才能访问外部类的任何实例变量或非静态方法。

非静态嵌套类(称为内部类)仅在外部类的实例的上下文中才存在。构造后,它们会自动生成第二个this字段,您可以使用语法Outer.this从内部类中访问该字段。内部类的每个实例都被外部类的单个实例包围。同样,静态嵌套类的所有访问权限都适用于内部类。但是,由于它们已经具有可用的外部类实例,因此它们可以自动访问外部类的实例变量和方法。

要对内部类和访问说明符进行漂亮(非常详细)的讨论,可以通读Inner Class Specification。它描述了嵌套类如何访问其外部类的private成员。读起来更温和的是Nested Classes tutorial

除了题外话:假设您具有以下类结构:

public class O {
    public O() { ... }

    public class I { // an inner class
        public I() { ... }
        ...
    }
    ...
}


并且您已创建O的实例:

O outer = new O();


现在假设您要创建O.I的实例。您不能只使用new O.I(),因为I的新实例需要包含在O的特定实例中。为此,Java提供了以下语法:

O.I inner = outer.new O.I();


然后,inner的第二个this字段将设置为引用outer

请注意,此“限定的new运算符”语法仅用于内部类;请参见图5。如果Istatic嵌套类,则没有必要(实际上是一个错误)。

1经常会遇到“静态内部类”这一短语(令人尴尬的是,在此答案的较早版本中)。这是不正确的术语。在Java中,“内部类”特别是非static嵌套类。

10-07 19:51
查看更多