当Java中的静态变量与静态类具有相同的名称时会发生什么?

16 浏览
0 Comments

当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日
0
0 Comments

您用一个名为Y的静态实例W来隐藏类Y。类Y仍然存在且可以使用。尝试:

System.out.println(X.Y.Z);
System.out.println((new X.Y()).Z);

输出应该是

Orange
Apple

另请参见:Java字段隐藏

0
0 Comments

变量Y会掩盖类型Y。参见JLS:

6.4.2.掩盖

一个简单的名称可能出现在可能被解释为变量、类型或包名的上下文中。在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称引用可见的类型或包声明。我们称这样的声明被掩盖。

限定名称X.Y.Z按以下方式解决:

6.5.2.重新分类上下文模糊的名称

...

如果“.”左侧的名称被重新分类为TypeName,则:

  • 如果标识符是由TypeName表示的类型的方法或字段的名称,则此AmbiguousName将被重新分类为ExpressionName。

  • 否则,如果标识符是由TypeName表示的类型的成员类型的名称,则此AmbiguousName将被重新分类为TypeName。

  • 否则,将出现编译时错误。

这在实践中不太可能发生,因为类型和变量的命名约定通常会避免此类情况。

0