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的代码片段

以下是按时间顺序发生的事情:

  1. B类包含main方法,因此它由类加载器加载。

  2. 初始化B引用A ,因此加载了A类。

  3. A有一个静态变量X初始化为BY + 1

    BY的初始化尚未执行,因此BY计算为0,因此将1分配给AX

  4. 现在A已经完成加载,并且可以进行BY的初始化。

    AX + 1 (1 + 1)的值分配给BY

  5. AXBY的值分别打印为12

进一步阅读:

Java语言规范,§12.4.1发生初始化时

这只是我的猜测:

  1. B类已加载,因为它包含您请求执行的main
  2. 类加载器发现B需要A来操作(它通过访问其静态字段使用 A
  3. B级已加载。
  4. A类要求B类恰好已经加载但尚未初始化
  5. 不小心加载BY (默认情况下初始化为0),因为类看起来像加载(语言设计缺陷?)
  6. AX = 0 + 1
  7. A现在已加载,类加载器可以继续加载并初始化B
  8. BY = 1 + 1

B公开开始加载自己。

看到AX = BY + 1 ==从0开始(默认的int对象值)因此为1;

初始化B = 1 + 1 = 2;

因此答案。