12

以下代码是合法前向引用的情况吗?如果是,为什么?

public class MyClass
{
  private static int x = getValue();
  private static int y = 5;
  private static int getValue()
  {
    return y;
  }
  public static void main(String[] args)
  {
    System.out.println(x);
  }
}
4

2 回答 2

19

您拥有的上述代码是完全合法的 Java。在 Java 中,静态字段的初始化方式如下:首先,所有字段都设置为其类型的默认值(0、falsenull),然后按照声明它们的顺序进行初始化。这意味着上面的代码保证执行以下操作:

  1. 设置xy为零,因为这是 s 的默认值int
  2. x通过调用进行初始化getValue(),它读取 的值y。由于y尚未初始化,它的值仍然为 0。
  3. 初始化y为 5。

这意味着x它将取值 0 并将y取值 5。这种行为是可移植的且有保证的。 你可以在这里看到这个

希望这可以帮助!

于 2012-04-05T20:58:49.190 回答
5

您可以通过它编译的事实来判断它是否合法;与其他一些语言不同,Java 没有“未定义行为”的概念。这里发生的事情已经完全说明。这可能违反直觉,但它特别合法:您可以在从初始化另一个静态变量时调用的方法初始化静态变量之前访问它。y直接从x' 的初始化程序访问的表面上相似的情况——即,

private static int x = y;
private static int y = 5;

是特别不允许的。真的没有什么强有力的理由——它就是这样。

于 2012-04-05T21:00:34.290 回答