sách gpt4 ăn đã đi

java - 解释包含接口(interface)的java代码的输出

In lại 作者:搜寻专家 更新时间:2023-11-01 04:00:35 25 4
mua khóa gpt4 giày nike

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

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

câu trả lời hay nhất

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

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

现在虽然 InterfaceC.C 引用了 InterfaceA.A,但 VM 已经在初始化 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.

Vì vậy InterfaceA.A 仍然是 0(我们仍在尝试确定它应该 的值,而 0 是 int 的默认值),InterfaceC.C 的值为 1 (0 + 1)。然后 InterfaceB.B 得到一个值 2 (1 + 1),而 InterfaceA.A 得到一个值 4 (2 * 2)。

将所有这些字段值相加,最后得到 7。

如果您使用不同的表达式,您将获得不同的值,因为您会看到最后初始化的是不同的接口(interface),尽管它仅取决于您引用的第一个字段:

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)

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

关于java - 解释包含接口(interface)的java代码的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19442774/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress