执行主类后的输出不同

时间:2012-08-31 22:46:51

标签: java

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

class X {
    static class Y {
        static String Z = "Result 1";
    }
    static C Y = new C();
}

class C {
    String Z = "Result 2";
}  

有时输出为"Result 1",有时输出为"Result 2"。你能解释一下原因吗?

我正在使用JDK 1.6_33

1 个答案:

答案 0 :(得分:9)

这是Java Puzzler#68 - 它应该始终打印Result 2。引用:

  

事实证明,在这些情况下,有一条规则可以控制程序行为。当一个   变量和类型具有相同的名称,并且两者都在范围内,变量名称采用   优先顺序[JLS 6.5.2]。据说变量名称模糊了类型名称[JLS 6.3.2]。同样的,   变量和类型名称可能会模糊包名称。这条规则确实模糊不清   依赖于它的程序可能会使读者感到困惑。