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
?
答案 0 :(得分:10)
请参阅JLS
6.4.2。模糊
一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称。在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称引用可见类型或包声明。我们说这样的声明是模糊不清的。
在6.5.2. Reclassification of Contextually Ambiguous Names部分下:
如果名称在“。”左侧。被重新分类为TypeName,然后:
如果Identifier是TypeName表示的类型的方法或字段的名称,则此AmbiguousName将重新分类为ExpressionName。
否则,如果Identifier是TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName。
- 醇>
否则,会发生编译时错误。
答案 1 :(得分:4)
您的内部类和静态变量的名称相同。它不必对类加载的顺序做任何事情,X.Y
被解释为对变量的访问,而不是内部类。
答案 2 :(得分:4)
结果为white
,,因为您的命名惯例非常糟糕。
无论其他人会给你什么技术原因,甚至考虑问题的唯一原因是你以这样的方式命名你的变量,你自己和所有其他人将无法阅读和理解。唯一没有问题的是编译器,它的定义严格到足以知道该怎么做。
答案 3 :(得分:2)
这是一个棘手的问题。从不使用类Y
,static C Y = new C();
是名为Y的C类实例,与类Y