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

时间:2012-12-25 02:20:06

标签: 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";
}

2 个答案:

答案 0 :(得分:10)

变量Y遮盖了Y类型。请参阅JLS

  

6.4.2。模糊

     

简单名称可能出现在可能存在的上下文中   解释为变量,类型或包的名称。在这些   在情况下,§6.5的规则指定将选择变量   优先于类型,并且将优先选择类型   一个包。因此,有时可能无法参考a   通过简单名称显示可见类型或包声明。我们这么说   这样的声明模糊不清。

限定名称X.Y.Z根据以下内容解决:

  

6.5.2。上下文不明确名称的重新分类

     

...

     

如果名称在“。”左侧。被重新分类为TypeName,然后:

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

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

  •   
  • 否则,会发生编译时错误。

  •   

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

答案 1 :(得分:3)

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

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

输出应为

Orange
Apple

另见:Java Field Hiding