Java中的静态循环依赖


问题内容

对于以下代码:

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

为什么?如何???

-伊瓦尔

PS:摘自JavaCamp.org的代码段


问题答案:

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

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

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

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

的初始化B.Y尚未执行,因此B.Y求值为0,因此将1分配给A.X

  1. 现在A已经完成加载,并且B.Y可以初始化。

A.X + 1(1 +1)被分配给B.Y

  1. 的值A.XB.Y被打印为12分别。

进一步阅读:

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