【问题标题】:Different output after execution main class执行主类后输出不同
【发布时间】:2012-08-31 22:46:51
【问题描述】:
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

【问题讨论】:

  • 使用 JDK 1.6.24,我每次都得到Result 2
  • @mellamokb 我也是。每一次。
  • 我下载了JDK 1.6.33,编译运行代码sn -p 20次。每次都收到Result 2
  • 这个结果很奇怪,因为即使你的 jdk 有问题,一旦编译,代码应该只产生一种类型的结果:编译器要么放入字段访问,要么放入内部类访问,这应该就这样吧。
  • 现在我无法重现结果 1... 可能是我的错误。哦,我的视力不好

标签: java


【解决方案1】:

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

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

【讨论】:

  • 并且任何编写依赖于此的代码的人都应该被卷入tar和feather中。
  • 在哪里可以看到这个 Java 谜题?
  • 不错的拼图。我设法得到X.Y ref=null; System.out.println(ref.Z); 的“结果1”。您认为这是一种很好的做法还是有更好的方法?
  • @Pshemo 我不确定您所说的“良好做法” - 原始代码一开始就不是好的做法。良好做法 = 避免任何模棱两可的事情。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2015-06-11
  • 2021-06-30
相关资源
最近更新 更多