Java Legal Forward Referencing

Vib*_*hor 12 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 19

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

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

这意味着x将采用值0并将y取值5.此行为是可移植且有保证的. 你可以在这看到这个.

希望这可以帮助!

  • 我相信行为是一样的 - 初始化首先将所有内容设置为默认值,然后使用指定的值初始化每个,然后调用构造函数. (2认同)

Ern*_*ill 5

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

private static int x = y;
private static int y = 5;
Run Code Online (Sandbox Code Playgroud)

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