当静态变量与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

回到顶部