静态内部类和类的静态成员共享SAME NAME?

Din*_*mar 9 java static-methods static-members

静态内部类MM[类C]的静态成员如何共享同一个名称?

以下代码生成"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";
}
Run Code Online (Sandbox Code Playgroud)

如何访问成员对象而不是静态类成员:W ["Black"]

如果我想访问静态类M中的成员怎么做?

Ted*_*opp 2

Java 语言规范的第 6 章(特别是第 6.5 节)详细说明了 Java 如何整理特定标识符在特定上下文中的含义的可怕细节。规则相当复杂,但粗略地说,Java 有六个名称空间:

  • 包名
  • 类型名称
  • 字段(变量)名称
  • 方法名称
  • 局部变量名(包括参数)
  • 标签

相同的标识符可用于每个名称空间中的实体。请注意,类型(类)名称和字段名称是分开的,这解释了为什么您的代码是合法的。

同一名称空间中的继承名称有时也可能被隐藏或屏蔽。有时标识符是不明确的;然后需要以某种方式对其进行限定(例如,使用包名称),否则编译器会抱怨。

代码混淆器充分利用了这一点,最终您可以得到一个名为 package 的包a.a和一个名为ain package的类a(也将被标识为a.a)。更不用说 Java 关键字如dofor是 .class 文件中的合法名称(但在 Java 源代码中则不然)。它有助于使逆向工程成为真正的熊。