当Java中的静态变量与静态类具有相同的名称时会发生什么?
当Java中的静态变量与静态类具有相同的名称时会发生什么?
在下面的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"; }
admin 更改状态以发布 2023年5月23日
您用一个名为Y的静态实例W来隐藏类Y。类Y仍然存在且可以使用。尝试:
System.out.println(X.Y.Z); System.out.println((new X.Y()).Z);
输出应该是
Orange Apple
另请参见:Java字段隐藏
变量Y会掩盖类型Y。参见JLS:
6.4.2.掩盖
一个简单的名称可能出现在可能被解释为变量、类型或包名的上下文中。在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称引用可见的类型或包声明。我们称这样的声明被掩盖。
限定名称X.Y.Z按以下方式解决:
6.5.2.重新分类上下文模糊的名称
...
如果“.”左侧的名称被重新分类为TypeName,则:
如果标识符是由TypeName表示的类型的方法或字段的名称,则此AmbiguousName将被重新分类为ExpressionName。
否则,如果标识符是由TypeName表示的类型的成员类型的名称,则此AmbiguousName将被重新分类为TypeName。
否则,将出现编译时错误。
这在实践中不太可能发生,因为类型和变量的命名约定通常会避免此类情况。