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