Java Legal Forward Referencing
以下代码是合法前向引用的情况吗? 如果是,为什么?
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); } }
上面的代码是完全合法的Java。 在Java中,静态字段初始化如下:首先,将所有字段设置为其类型的默认值(0, false
或null
),然后按声明它们的顺序进行初始化。 这意味着上述代码保证执行以下操作:
- 将
x
和y
设置为零,因为这是int
的默认值。 - 通过调用
getValue()
初始化x
,它读取y
的值。 由于y
尚未初始化,因此它仍然具有值0。 - 将
y
初始化为5。
这意味着x
将取值0, y
将取值5.此行为是可移植且有保证的。 你可以在这看到这个 。
希望这可以帮助!
你可以通过编译来判断它是否合法; 与其他语言不同,Java没有“未定义行为”的概念。 这里发生的事情是完全拼写出来的。 它可能是违反直觉的,但它是特别合法的:您可以在从初始化另一个静态变量时调用的方法初始化之前访问静态变量。 从x
的初始化器直接访问y
的表面上类似的情况 – 即,
private static int x = y; private static int y = 5;
是特别禁止的。 真的没有充分的理由 – 它就是它的原因。