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行,您将获得所有上述表达式的相同答案.)
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 C 是1.
现在,你需要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
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |