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