加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:21:13 所属栏目:Java 来源:网络整理
导读:我遇到了一个问题,我无法找出其输出为什么会出现的问题 7 当我以数学方式计算它可以产生7,8或任何其他数字的输出所以我的问题是它的基础是什么 interface InterfaceA{ int A = InterfaceB.B * 2;}interface InterfaceB{ int B = InterfaceC.C + 1;}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);
    }
}

解决方法

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

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

现在虽然InterfaceC.C引用了InterfaceA.A,但虚拟机已经在初始化InterfaceA,所以无论如何它都会进行(根据JLS的section 12.4.2):

If the Class object for C indicates that initialization is in progress for C by the current thread,then this must be a recursive request for initialization. Release LC and complete normally.

所以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行,你将得到所有上述表达式的相同答案.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读