执行主类后的输出不同

Ily*_*lya 5 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";
}  
Run Code Online (Sandbox Code Playgroud)

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

我在用JDK 1.6_33.

ass*_*ias 9

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

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

  • 任何编写依赖于此的代码的人都应该加入焦油和羽毛. (4认同)