解释包含接口的java代码的输出
我遇到了一个问题,我无法找出其输出为什么会出现的问题
当我以数学方式计算它可以产生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); } } 解决方法
显然,这样的代码永远不应该发生.这太可怕了.我不认为你应该花太多时间担心它为什么会给出7,但实际上并不难看出原因.
要评估的第一个字段值是InterfaceA.A,因此VM开始初始化InterfaceA.这需要InterfaceB.B,因此它开始初始化InterfaceB.这需要InterfaceC.C,因此它开始初始化InterfaceC. 现在虽然InterfaceC.C引用了InterfaceA.A,但虚拟机已经在初始化InterfaceA,所以无论如何它都会进行(根据JLS的section 12.4.2):
所以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,C = 1) B + A + C = 3 (A = 0,C = 1) B + C + A = 3 (A = 0,C = 1) C + A + B = 6 (A = 2,B = 1,C = 3) C + B + A = 6 (A = 2,C = 3) (当然,你必须替换现有的代码行,因为这是关于类型初始化的 – 如果你只是添加更多的System.out.println行,你将得到所有上述表达式的相同答案.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |