当静态变量与Java中的静态类同名时会发生什么?
在下面的Java示例中,谁能确切解释为什么程序输出为“ Orange”?(这是一个面试问题)
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";
}
回答:
变量Y掩盖了类型Y。请参见JLS:
6.4.2。遮盖
简单名称可能出现在可能被解释为变量,类型或包的名称的上下文中。在这些情况下,第6.5节的规则指定将优先于类型选择变量,并优先于包选择类型。因此,有时可能无法通过其简单名称引用可见类型或程序包声明。我们说这样的声明是模糊的。
合格名称XYZ的解析是根据:
6.5.2。上下文不明确名称的重新分类
…
如果名称在“。”的左边。被重新分类为TypeName,则:
如果标识符是TypeName表示的方法名称或类型的类型的字段,则此AmbiguousName将重新分类为ExpressionName。
否则,如果标识符是用TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName。
否则,将发生编译时错误。
实际上,由于类型和变量的常规命名约定,这种情况不太可能发生。
以上是 当静态变量与Java中的静态类同名时会发生什么? 的全部内容, 来源链接: utcz.com/qa/419021.html