当嵌套类与封闭类的静态成员共享名称时,访问嵌套类的静态成员?

时间:2013-11-04 22:44:08

标签: java

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

package a;

class a {
    static Object b;

    static class b {

        static Object foo;
    }

    static Object needAccessToFoo;

    static {
        // can I access foo?
    }

} 

通过b(或b)用作类型时,可以访问类a(而不是成员[b.]b.a)。并且可以使用嵌套类foo的实例访问b,如下所示:

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

但是,由于b嵌套类而不是内部类,因此会让人怀疑是否有正确的方法来静态引用{ {1}}没有经过foo的实例(b引用的对象)。更不用说通过对象访问静态成员通常被认为是不好的做法。

2 个答案:

答案 0 :(得分:1)

此问题称为遮挡。 The JLS states

  

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

无法访问foo

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

答案 1 :(得分:0)

是的,因为一切都是静态的,astatic块的范围内,您可以这样做:

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

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