解释包含接口的java代码的输出

时间:2013-10-18 06:12:10

标签: java algorithm math interface

我遇到了一个问题,我无法找出其输出为什么

  

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

3 个答案:

答案 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);

当您要求AInterfaceB.B * 2;)时,您需要B

因此,B需要解决,

 int B = InterfaceC.C + 1;

当您要求BInterfaceC.C + 1)时,您需要C

因此,C需要解决,

  int C = A + 1;       //  0+1 =1

A尚未解决,默认为0

所以int C1

现在,您需要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),你知道控制从rightleft。 在这种情况下,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