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.
这是Java Puzzler#68 - 它应该始终打印Result 2.引用:
事实证明,在这些情况下,有一条规则可以控制程序行为.当变量和类型具有相同的名称且两者都在范围内时,变量名称优先[JLS 6.5.2].据说变量名称模糊了类型名称[JLS 6.3.2].同样,变量和类型名称可能会掩盖包名称.这条规则确实模糊不清,任何依赖它的程序都可能会使读者感到困惑.