Java中的静态循环依赖
对于以下代码:
class A { public static int X; static { X = BY + 1;} } public class B { public static int Y = AX + 1; static {} public static void main(String[] args) { System.out.println("X = "+A.X+", Y = "+BY); } }
输出为:X = 1,Y = 2
为什么? 如何???
-Ivar
PS:来自JavaCamp.org的代码片段
以下是按时间顺序发生的事情:
-
B
类包含main方法,因此它由类加载器加载。 -
初始化
B
引用A
,因此加载了A
类。 -
A
有一个静态变量X
初始化为BY + 1
。BY
的初始化尚未执行,因此BY
计算为0,因此将1分配给AX
-
现在
A
已经完成加载,并且可以进行BY
的初始化。AX + 1
(1 + 1)的值分配给BY
。 -
AX
和BY
的值分别打印为1
和2
。
进一步阅读:
Java语言规范,§12.4.1发生初始化时
这只是我的猜测:
-
B
类已加载,因为它包含您请求执行的main
。 - 类加载器发现
B
需要A
来操作(它通过访问其静态字段使用A
) -
B
级已加载。 - A类要求
B
类恰好已经加载但尚未初始化 - 不小心加载
BY
(默认情况下初始化为0),因为类看起来像加载(语言设计缺陷?) -
AX = 0 + 1
-
A
现在已加载,类加载器可以继续加载并初始化B
-
BY = 1 + 1
。
B公开开始加载自己。
看到AX = BY + 1 ==从0开始(默认的int对象值)因此为1;
初始化B = 1 + 1 = 2;
因此答案。