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

ank*_*kit 3 java algorithm math interface

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

7

当我以数学方式计算它可以产生7,8或任何其他数字的输出所以我的问题是它的基础是什么

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

显然,这样的代码永远不应该发生.这太可怕了.我认为你不应该花太多时间担心为什么会给出7,但实际上并不难看出原因.

要评估的第一个字段值是InterfaceA.A,因此VM开始初始化InterfaceA.这需要InterfaceB.B,所以它开始初始化InterfaceB.这需要InterfaceC.C,所以它开始初始化InterfaceC.

现在虽然InterfaceC.C指的是InterfaceA.A,VM已经在初始化InterfaceA,所以它只是继续进行(根据JLS的第12.4.2节):

如果C的Class对象指示当前线程正在为C进行初始化,那么这必须是初始化的递归请求.释放LC并正常完成.

所以InterfaceA.A仍然是0(我们仍然试图找出它应该具有的值,0是默认值int),并InterfaceC.C获得值1(0 + 1).然后InterfaceB.B获取值2(1 + 1),并InterfaceA.A获得值4(2*2).

对所有这些字段值求和,最后得到7.

如果你使用不同的表达式,你会得到一个不同的值,因为你会看到最后一个不同的接口被初始化,虽然它只取决于你引用的第一个字段:

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)
Run Code Online (Sandbox Code Playgroud)

(当然,您必须替换现有的代码行,因为这是关于类型初始化的 - 如果您只是添加更多System.out.println行,您将获得所有上述表达式的相同答案.)


Sur*_*tta 6

System.out.println(A + B + C);
Run Code Online (Sandbox Code Playgroud)

当你要求A(InterfaceB.B * 2;)时,你需要B

所以,B 需要解决,

 int B = InterfaceC.C + 1;
Run Code Online (Sandbox Code Playgroud)

当你要求B(InterfaceC.C + 1)时,你需要C

所以,C 需要解决,

  int C = A + 1;       //  0+1 =1
Run Code Online (Sandbox Code Playgroud)

A尚未解决,默认为 0

所以int C1.

现在,你需要B.

  int B = InterfaceC.C + 1;   // 1+1  =2
Run Code Online (Sandbox Code Playgroud)

现在

 int A = InterfaceB.B * 2;  // 2*2 =4
Run Code Online (Sandbox Code Playgroud)

最后

1 + 2 + 4 = 7