Java的法律正向引用(Java Legal Forward Referencing)

2019-06-23 09:54发布

在下面的代码法律向前引用的情况下? 如果是,为什么?

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

Answer 1:

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

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

这意味着, x将采取的值0和y将值5。这种行为是便携式的,并保证。 你可以在这里看到

希望这可以帮助!



Answer 2:

你可以告诉它是否是合法的或不被其编译的事实; 其它语言不同,Java没有的概念“未定义的行为。” 这里发生的是完全拼写出来。 这可能是违反直觉的,但它是专门法律:之前它是从,而另一初始化静态变量调用的方法初始化,您可以访问一个静态变量。 访问的表面类似的情况下y直接从x的初始值设定-即

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

特别禁止。 确实没有很强的理由 - 这只是它是如何。



文章来源: Java Legal Forward Referencing