Java中的静态循环依赖

时间:2011-06-20 19:32:16

标签: 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);
    }
}

输出是:    X = 1,Y = 2

为什么呢?以及如何???

-Ivar

P.S:摘自JavaCamp.org

的代码段

3 个答案:

答案 0 :(得分:21)

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

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

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

  3. A将静态变量X初始化为B.Y + 1

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

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

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

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

  6. 进一步阅读:

    Java Language Specification, §12.4.1 When Initialization Occurs

答案 1 :(得分:3)

这只是我的猜测:

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

答案 2 :(得分:0)

B公开开始加载自己。

看见A.X = B.Y +1 ==以0开头(默认的int对象值)因此为1;

初始化B = 1 + 1 = 2;

因此答案。