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

Far*_*raz 6 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";
}
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.

  • 否则,发生编译时错误.

由于类型和变量的正常命名约定,这在实践中不太可能发生.