5

java源代码如:

public class Test{
    public static void main(String[] args){
       System.out.println(X.Y.Z);
    }   
}


class X { 
    static class Y{
       static String Z = "balck";
    }   

    static C Y  = new C();
}

class C{
    String Z = "white";
}

为什么结果是:white

4

4 回答 4

10

请参阅JLS

6.4.2. 遮蔽

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

根据第6.5.2 节。上下文模糊名称的重新分类

如果名称在“。”的左侧。被重新分类为 TypeName,则:

  1. 如果标识符是由 TypeName 表示的类型的方法或字段的名称,则此 AmbiguousName 被重新分类为 ExpressionName。

  2. 否则,如果 Identifier 是由 TypeName 表示的类型的成员类型的名称,则将此 AmbiguousName 重新分类为 TypeName。

  3. 否则,会发生编译时错误。

于 2013-06-14T11:30:46.870 回答
4

您的内部类和静态变量的名称相同。它与类加载的顺序无关,X.Y被解释为对变量的访问,而不是内部类。

于 2013-06-14T11:31:11.003 回答
4

结果是white因为您的命名约定非常糟糕

不管其他人会给你/已经给你什么技术原因,甚至考虑这个问题的唯一原因是你以这样的方式命名你的变量,你自己和所有其他人都将难以阅读和理解。唯一不会遇到麻烦的是编译器,它的定义足够严格,知道该做什么。

于 2013-06-14T11:37:35.543 回答
2

这是一个技巧问题。该类Y从未使用过,static C Y = new C();是名为 Y 的类 C 的实例,与该类无关Y

于 2013-06-14T11:31:44.633 回答