在下面的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";
}
Run Code Online (Sandbox Code Playgroud)
fgb*_*fgb 10
变量Y模糊了Y类型.请参阅JLS:
6.4.2.模糊
一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称.在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包.因此,有时可能无法通过其简单名称引用可见类型或包声明.我们说这样的声明是模糊的.
根据以下内容解析限定名称XYZ:
6.5.2.上下文不明确名称的重新分类
...
如果名称在"."左侧.被重新分类为TypeName,然后:
如果Identifier是TypeName表示的类型的方法或字段的名称,则此AmbiguousName将重新分类为ExpressionName.
否则,如果Identifier是TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName.
否则,发生编译时错误.
由于类型和变量的正常命名约定,这在实践中不太可能发生.