5
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.

4

1 回答 1

9

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

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

于 2012-08-31T22:49:31.167 回答