以下代码是否合法的前向引用?如果是,为什么?
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);
}
}
以下代码是否合法的前向引用?如果是,为什么?
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
设置为0,因为这是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;
具体禁止使用此功能。没有强烈的理由 -- 这就是事实。
<clinit>()
的单个方法。 - Ernest Friedman-Hill
this
,甚至可以看到一个未初始化的最终字段。 - yshavit