无法获得以下代码的逻辑

Not able to get the logic of below code

public interface AI {
    public static final int A = BI.B+1;
}
public interface BI {
    public static final int B = CI.C;
}
public interface CI extends AI {
    public static final int C = A+1;
}

public class Test implements AI, CI, BI {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("A : " + A);
        System.out.println("B : " + B);
        System.out.println("C : " + C);
        System.out.println(A+B+C);
    }

}

O/p --> 4

有人可以帮我理解输出 4 背后的代码流和逻辑吗? 谢谢

在加载接口之前,不会设置接口中变量的值。它们由第一条语句加载:

System.out.println("A : " + A);

这会导致 AI 被加载和初始化。它试图将 A 的值设置为 BI.B+1.

这会导致 BI 被加载和初始化。它试图将 B 的值设置为 C1.C.

这会导致 CI 被加载和初始化。在这里,它扩展 AI 的事实只允许 A 被一个简单的名称引用。它设置为 A+1。从技术上讲,AI 仍在初始化; AI 中的 A 值尚未设置。在 Java 中,未设置的变量具有默认值,对于原始数字类型,默认值为 0.

所以,'C'得到值1B也得到1。这意味着 A 设置为 2。这就是为什么前 3 个打印语句的输出是

A : 2
B : 1
C : 1

当然,这些值会加到 4

另外,我希望这只是一个谜题,而不是真正的代码;看起来这个技巧允许人们在 static final 变量被设置之前读取它(AI.A 作为 0CCI 初始化中)。 JLS, Section 9.3.1,指出:

Note that interface fields that are constant variables (§4.12.4) are initialized before other interface fields. This also applies to static fields that are constant variables in classes (§8.3.2). Such fields will never be observed to have their default initial values (§4.12.5), even by devious programs.

初始化 static final 变量的

None 个值是常量表达式,因此它们不是常量变量。常量变量是 final 用常量表达式初始化的变量。这使它成为 "devious program".