在下面的java示例中,任何人都可以解释为什么程序的输出是“橙色”? (这是面试问题)
public class Finder {
public static void main(String[] args){
System.out.println(X.Y.Z);
}
}
class X {
static W Y = new W();
static class Y {
static String Z ="Apple";
}
}
class W {
String Z = "Orange";
}
答案 0 :(得分:10)
变量Y遮盖了Y类型。请参阅JLS:
6.4.2。模糊
简单名称可能出现在可能存在的上下文中 解释为变量,类型或包的名称。在这些 在情况下,§6.5的规则指定将选择变量 优先于类型,并且将优先选择类型 一个包。因此,有时可能无法参考a 通过简单名称显示可见类型或包声明。我们这么说 这样的声明模糊不清。
限定名称X.Y.Z根据以下内容解决:
6.5.2。上下文不明确名称的重新分类
...
如果名称在“。”左侧。被重新分类为TypeName,然后:
如果Identifier是TypeName表示的类型的方法或字段的名称,则此AmbiguousName将重新分类为ExpressionName。
否则,如果Identifier是TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName。
否则,会发生编译时错误。
由于类型和变量的正常命名约定,这在实践中不太可能发生。
答案 1 :(得分:3)
您正在使用名为Y的W的静态实例隐藏类Y.类Y仍然存在并且可以使用。尝试:
System.out.println(X.Y.Z);
System.out.println((new X.Y()).Z);
输出应为
Orange
Apple