Java中的静态循环依赖

top*_*ard 13 java circular-dependency

对于以下代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:X = 1,Y = 2

为什么?如何???

-Ivar

PS:来自JavaCamp.org的代码片段

aio*_*obe 22

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

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

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

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

    初始化B.Y尚未执行,因此B.Y计算结果为0,因此分配了1A.X

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

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

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

进一步阅读:

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

  • 由于循环初始化依赖关系,不言而喻,这种代码应该令人皱眉。 (2认同)
  • 关键点是要注意静态初始化器只会运行一次。因此,如果 ClassA 的静态初始化程序调用 ClassB 的静态初始化程序,而 ClassB 的静态初始化程序又再次调用 ClassA 的静态初始化程序,则该非首次调用将被忽略。 (2认同)