Java 无法获取下面代码的逻辑

Java 无法获取下面代码的逻辑,java,interface,Java,Interface,O/p-->4 有人能帮我理解输出4背后的代码流和逻辑吗? 谢谢。在加载接口之前,不会设置接口中变量的值。它们由第一条语句加载: 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 in

O/p-->4

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

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

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);
    }

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

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

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

因此,'C'得到值
1
,而
B
也得到
1
。这意味着
A
被设置为
2
。这就是为什么前3个print语句的输出是

System.out.println("A : " + A);
当然,这些值会添加到
4

此外,我希望这只是一个谜,而不是真正的代码;似乎这个技巧允许人们在设置
静态final
变量之前读取它(
AI.a
CI
初始化
C
中作为
0
)。报告指出:

注意,作为常量变量(§4.12.4)的接口字段在其他接口字段之前初始化。这也适用于类中作为常量变量的静态字段(§8.3.2)。即使通过迂回的程序,也不会观察到此类字段具有默认初始值(§4.12.5)


初始化
静态final
变量的值都不是常量表达式,因此它们不是常量变量。常量变量是用常量表达式初始化的
final
变量。这使得这是一个“迂回的计划”

为什么投票被否决?“OP根本没有表现出任何理解,但我认为这是一个合理的问题,因为正在加载的接口之间的交互。”Mrtman同意。如果用不同的措辞,这是一个好问题。我在C#上试过(这台电脑上没有安装java,而且在线编译器不支持超过1个文件),它让我感到很困扰,我怎么也无法设置。另外,我在大学的java课堂上也看到过类似的问题。非常感谢你的帮助和如此精彩的解释。不客气。在每一个问题上,你都有一个你认为最有帮助的选择。
A : 2
B : 1
C : 1