Java 中的静态循环依赖关系

2022-09-03 12:45:45

对于以下代码:

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

为什么?又是如何做到的呢?

P.S:取自 JavaCamp.org 的代码片段


答案 1

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

  1. 类包含 main-method,因此它由类装入器装入。B

  2. 初始化引用,以便加载类。BAA

  3. A具有初始化为 的静态变量。XB.Y + 1

    的初始化尚未执行,因此计算结果为 0,因此 1 分配给B.YB.YA.X

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

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

  5. 的值分别打印为 和。A.XB.Y12

延伸阅读:

Java 语言规范,§12.4.1 进行初始化时


答案 2

这只是我的猜测:

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

推荐