当嵌套类与封闭类的静态成员共享名称时,是否有任何方法可以从封闭类访问嵌套类的静态成员?例如:
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
引用的对象)。更不用说通过对象访问静态成员通常被认为是不好的做法。
答案 0 :(得分:1)
此问题称为遮挡。 The JLS states
简单名称可能出现在可能存在的上下文中 解释为变量,类型或包的名称。在这些 在情况下,§6.5的规则指定将选择变量 优先于类型,并且将优先选择类型 一个包。因此,有时可能无法引用a 通过简单名称显示可见类型或包装声明。我们这样说 这样的声明模糊不清。
无法访问foo
。
在static
初始化程序块的上下文中,有两个名称为b
的内容。并且由于上述规则,在使用该冲突名称时将始终选择变量。使用其封闭类型限定变量a.b
不会更改任何内容,因为变量为static
,因此可通过该引用访问。
答案 1 :(得分:0)
是的,因为一切都是静态的,a
在static
块的范围内,您可以这样做:
static {
Object foo2 = a.foo;
// can I access foo?
}
您需要重命名外部类以防止名称冲突。否则,编译器将如何知道您指的是哪个a
?