静态内部类M和C类的静态成员M如何共享同名?
以下代码生成"White“作为输出:
public class Amazed{
public static void main(String[] args) {
System.out.println(B.M.W);
}
}
class B {
public static class M {
static String W = "Black";
}
static C M = new C();
}
class C {
String W = "White";
}成员对象的访问方式,而不是静态类成员:W "Black“
如果我想访问静态类M中的成员,怎么办?
发布于 2013-07-26 17:32:11
Java语言规范第6章 (特别是第6.5款)详细阐述了Java在特定上下文中如何分类特定标识符的可怕细节。这些规则相当复杂,但粗略地说,Java有六个名称空间:
相同的标识符可用于每个名称空间中的实体。注意,类型(类)名称和字段名分别存在,这解释了为什么您的代码是合法的。
在同一名称空间中继承的名称有时也会被隐藏或蒙面。有时,标识符是模棱两可的;然后需要以某种方式对其进行限定(例如,使用包名),否则编译器会抱怨。
代码混淆器使用这一点有很大的优势,以至于您可以在包a中得到一个名为a的包和一个名为a的类(这个类也会被识别为a.a)。更不用说像do和for这样的Java关键字是.class文件中的合法名称(但在.class源代码中不是)。它有助于使逆向工程成为真正的熊。
发布于 2013-07-26 17:29:21
该变量掩盖了同名的类型。如果可以将名称解释为变量或类型,则首选变量。
你可以通过不给他们起同样的名字来避免这种情况。
来自Java语言规范,第6.4.2节:模糊
6.4.2.蒙蔽 简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5的规则规定,变量优先于类型,类型优先于包。因此,有时可能不可能通过简单的名称来引用可见类型或包声明。我们说,这样的宣言是模糊的。
发布于 2013-07-26 17:27:11
在可以实例化M的特定情况下,您可以使用这样的事实:静力学可以以非静态的方式访问:
public class Amazed{
@SuppressWarnings("static-access")
public static void main(String[] args) {
B.M val = new B.M();
System.out.println(val.W);
}
}
class B {
public static class M {
static String W = "Black";
}
static C M = new C();
}
class C {
String W = "White";
}上面的内容将打印“Black”,因为您通过B.M实例引用它来消除标识符的歧义。当然,在生产代码中,这绝不是一个好主意,因为静态字段不应该以非静态的方式访问。同样,它要求您创建一个B.M实例。
https://stackoverflow.com/questions/17887155
复制相似问题