代码如下:
class A
{
public static int X;
static { X = B.Y + 1;}
}
public class B
{
public static int Y = A.X + 1;
static {}
public static void main(String[] args) {
System.out.println("X = "+A.X+", Y = "+B.Y);
}
}
输出是: X = 1,Y = 2
为什么呢?以及如何???
-Ivar
P.S:摘自JavaCamp.org
的代码段答案 0 :(得分:21)
以下是按时间顺序发生的事情:
类B
包含main方法,因此它由类加载器加载。
初始化B
引用A
,因此加载了类A
。
A
将静态变量X
初始化为B.Y + 1
。
B.Y
的初始化尚未执行,因此B.Y
评估为0,因此将1分配给A.X
现在A
已完成加载,可以进行B.Y
的初始化。
A.X + 1
(1 + 1)的值已分配给B.Y
。
A.X
和B.Y
的值分别打印为1
和2
。
Java Language Specification, §12.4.1 When Initialization Occurs
答案 1 :(得分:3)
这只是我的猜测:
B
,因为它包含您请求执行的main
。B
需要A
才能运行(使用 A
访问其静态字段)B
。A
要求类B
恰好已加载但尚未初始化A
不小心加载B.Y
(默认情况下初始化为0),因为该类看起来像加载(语言设计缺陷?)A.X = 0 + 1
A
现已加载,类加载器可以继续加载并初始化B
B.Y = 1 + 1
。答案 2 :(得分:0)
B公开开始加载自己。
看见A.X = B.Y +1 ==以0开头(默认的int对象值)因此为1;
初始化B = 1 + 1 = 2;
因此答案。