0

当嵌套类与封闭类的静态成员共享名称时,有什么方法可以从封闭类访问嵌套类的静态成员?例如:

package a;

class a {
    static Object b;

    static class b {

        static Object foo;
    }

    static Object needAccessToFoo;

    static {
        // can I access foo?
    }

} 

当通过(或)用作类型时,可以访问类b(与成员相反)。并且可以使用嵌套类的实例来访问,如下所示:ba[b.]b.afoob

static {
    [a.][a.]b bar = new b();
    needAccessToFoo = bar.foo;
}

然而,由于b它是一个嵌套类而不是一个内部类,它让人怀疑是否有一种适当的方法来静态引用foo而不通过b(引用的对象bar)的实例。更不用说通过对象访问静态成员通常被认为是不好的做法。

4

2 回答 2

1

这个问题被称为模糊。JLS 声明

简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5 的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称来引用可见类型或包声明。我们说这样的声明是模糊的。

将无法访问foo

static初始化程序块的上下文中,有两个名称为b. 并且由于上述规则,在使用该冲突名称时将始终选择该变量。用它的封闭类型限定变量a.b不会改变任何东西,因为变量是static可以通过该引用访问的。

于 2013-11-04T22:59:43.610 回答
0

是的,因为一切都是静态的并且a在您的块范围内,您static可以执行以下操作:

static { Object foo2 = a.foo; // can I access foo? }

您将需要重命名外部类以防止名称冲突。否则编译器怎么知道a你指的是哪个?

于 2013-11-04T22:53:24.757 回答