Java Legal Forward Referencing

时间:2012-04-05 20:55:56

标签: java reference forward static-initialization

以下代码是否是合法转发引用的情况?如果是的话为什么?

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);
  }
}

2 个答案:

答案 0 :(得分:19)

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

  1. xy设置为零,因为这是int s的默认值。
  2. 通过调用x来初始化getValue()y读取y的值。由于y尚未初始化,因此其值仍为0.
  3. x初始化为5。
  4. 这意味着y将取值0,而{{1}}将取值5.此行为是可移植且有保证的。的 You can see this here

    希望这有帮助!

答案 1 :(得分:5)

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

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

是特别禁止的。真的没有充分的理由 - 它就是它的原因。