我遇到了一个问题,我无法找出其输出为什么
7
当我以数学方式计算时,它可以产生7,8或任何其他数字的输出所以我的问题是基于它仅以7为基础的输出
interface InterfaceA
{
int A = InterfaceB.B * 2;
}
interface InterfaceB
{
int B = InterfaceC.C + 1;
}
interface InterfaceC extends InterfaceA
{
int C = A + 1;
}
public class TestInterface implements InterfaceA, InterfaceB, InterfaceC {
public static void main(String[] args) {
System.out.println(A + B + C);
}
}
答案 0 :(得分:12)
显然,这样的代码永远不应该发生。这太可怕了。我不认为你应该花太多时间担心它为什么会给出7,但实际上并不难看出原因。
要评估的第一个字段值是InterfaceA.A
,因此VM开始初始化InterfaceA
。这需要InterfaceB.B
,因此它开始初始化InterfaceB
。这需要InterfaceC.C
,因此它开始初始化InterfaceC
。
现在虽然InterfaceC.C
引用了InterfaceA.A
,但虚拟机已经初始化InterfaceA
,因此它无论如何都会继续(按照section 12.4.2的JLS):
如果C的Class对象指示当前线程正在为C进行初始化,那么这必须是初始化的递归请求。释放LC并正常完成。
所以InterfaceA.A
仍为0(我们仍在努力弄清楚 应该具有什么价值,0是int
的默认值),{ {1}}获取值1(0 + 1)。然后InterfaceC.C
的值为2(1 + 1),InterfaceB.B
的值为4(2 * 2)。
对所有这些字段值求和,最后得到7。
如果你使用不同的表达式,你会得到一个不同的值,因为你会看到最后一个不同的接口被初始化,尽管它只取决于你引用的 first 字段: / p>
InterfaceA.A
(你必须替换现有的代码行,因为这是关于类型初始化的 - 如果你只是添加更多A + B + C = 7 (A = 4, B = 2, C = 1)
A + C + B = 7 (A = 4, B = 2, C = 1)
B + A + C = 3 (A = 0, B = 2, C = 1)
B + C + A = 3 (A = 0, B = 2, C = 1)
C + A + B = 6 (A = 2, B = 1, C = 3)
C + B + A = 6 (A = 2, B = 1, C = 3)
行,你将得到相同的答案以上表达方式。)
答案 1 :(得分:6)
System.out.println(A + B + C);
当您要求A
(InterfaceB.B * 2;
)时,您需要B
因此,B
需要解决,
int B = InterfaceC.C + 1;
当您要求B
(InterfaceC.C + 1
)时,您需要C
因此,C
需要解决,
int C = A + 1; // 0+1 =1
A尚未解决,默认为0
所以int C
是1
。
现在,您需要B
。
int B = InterfaceC.C + 1; // 1+1 =2
现在
int A = InterfaceB.B * 2; // 2*2 =4
最后
1 + 2 + 4 = 7
答案 2 :(得分:1)
当你运行代码时,执行从main
方法开始。主要是System.out.println(A+B+C)
,你知道控制从right
到left
。
在这种情况下,C
首先执行(因为它出现在最右侧),这意味着c=A+1
,但A is 0
所以C=1
。
现在B
位于C
左侧,因此B
将执行,这意味着B=C+1
所以B=2
(因为c已经是1)
由于A
处于极端left
所以现在A
已执行,这意味着A=B*2
最后是4+2+1=7
同样,如果您打印System.out.println(B+C+A);
,那么您将获得3