Java 静态内部类和类的静态成员共享相同的名称?

Java 静态内部类和类的静态成员共享相同的名称?,java,static-methods,static-members,Java,Static Methods,Static Members,静态内部类M和静态成员M[类C]如何共享相同的名称 以下代码生成“白色”作为输出: 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

静态内部类
M
和静态成员
M
[类
C
]如何共享相同的名称

以下代码生成“白色”作为输出:

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中的成员,该怎么做?

在可以实例化
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";
}

上面将打印“黑色”,因为您通过
B.M
的实例引用标识符来消除其歧义。当然,在生产代码中这绝不是一个好主意,因为不应该以非静态方式访问静态字段。同样,它要求您创建
B.M
的实例

该变量模糊了相同名称的类型。如果名称可以解释为变量或类型,则首选该变量

您可以通过不给他们相同的名字来避免这种情况

根据Java语言规范:

6.4.2。遮蔽

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

(特别是)详细阐述了Java如何在特定上下文中整理特定标识符的含义。规则相当复杂,但粗略地说,Java有六个名称空间:

  • 包名称
  • 类型名称
  • 字段(变量)名称
  • 方法名
  • 局部变量名称(包括参数)
  • 标签
相同的标识符可用于每个名称空间中的实体。请注意,类型(类)名称和字段名称是分开存在的,这解释了为什么您的代码是合法的

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


代码混淆器利用这一点非常有利,最终可以得到名为a.a的包和名为a的类(该类也将被标识为a.a)。更不用说像
do
for
这样的Java关键词是.class文件中的合法名称(但不是在Java源代码中)。这有助于使逆向工程成为一个真正的熊。

在大家的帮助和小游戏之后,我发现即使不为内部类创建对象,我们也可以访问成员W“Black”

简单地使用这个语句

M.W

但我不知道访问级别。[因为它是公共的?]即使没有公共的,它也能工作。怎么样?

我喜欢这种方法
meth
对你毫无帮助。不过,长时间的while循环可能更合适。@thattidotguy:或者是一些递归的东西,直到它破坏堆栈。谢谢BMT。但我不明白模糊和重新分类的规范。。。有人能帮我一下吗?@Dineshkumar访问字段的方式有优先权。如果你感到惊讶,请阅读这篇文章,了解它是如何被选择的?优先顺序是什么?1)变量2)类型3)包名此处的类型是否表示类以外的任何类型?它表示任何类型,包括类和接口。基元类型是关键字,因此不能将其用作变量名。