【问题标题】:What happens when a Static Variable has the same name as a Static Class in Java?当静态变量与 Java 中的静态类同名时会发生什么?
【发布时间】:2012-12-11 05:17:01
【问题描述】:

在下面的 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";
}

【问题讨论】:

  • X.Y 这个表达式指向类X 中定义的静态变量YYX 中的变量是 W 类型的对象,因此,X.Y.Z 必须是 orange。要获得Apple,您必须使用new X.Y().Z
  • 这是一个讨厌的面试问题。请注意,static W Y 违反了变量的 Java 命名约定。 (static String ZYString ZW 也是如此。)@t0mm13b - 声明的顺序与这种情况无关。
  • @TedHopp 你让我知道了,tbqh,之前在面试中从未被问过这个问题,但从阅读其他人的答案来看,这是一个非常讨厌的问题——公平地说,面试官的问题是什么观点?把自己想象成一个面试官,知道这个问题的陷阱——问题是,你会向潜在的候选人提出这个问题吗?它对现实世界有什么影响——如果在生产环境中发现了该代码,你一定是在开玩笑?
  • 另外,我真的认为面试官是原谅我,拿了 p!ss,因为在面试之前谁会在他们的脑海中携带一个 java 规范.. .显然,@fgb 很容易立即搜索规范并发布一个很有启发性的答案 - 不要敲响回答者,公平地说,总结了我可以从面试官那里收集到的一件事,他/她失去了很多潜在的候选人,因为有这样的问题让某人大吃一惊!
  • 即使是编译器作者也没有正确理解这些规则:bugs.sun.com/bugdatabase/…。我从来没有见过这样的代码,甚至在不应该做的例子中也没有。

标签: java


【解决方案1】:

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

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

输出应该是

Orange
Apple

另见:Java Field Hiding

【讨论】:

  • 你不是试图通过创建一个对象(new X.Y()).Z 以非静态方式访问静态类 Y。不过技术上没有问题
【解决方案2】:

变量 Y 掩盖了 Y 类型。参见JLS

6.4.2。遮蔽

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

限定名 X.Y.Z 解析依据:

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

...

如果名字在“.”的左边被重新归类为 TypeName,则:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多