gpt4 book ai didi

java - Java 静态初始化 block 上的奇怪代码

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:57:54 27 4
gpt4 key购买 nike

当通过 JLS 时 8.3.2.3我无法理解以下代码。

class Z {
static { i = j + 2; }
static int i, j;
static { j = 4; }
}

代码导致错误 Cannot reference a field before it is defined

但是如果我把代码改成

class Z {
static { i = 2; }
static int i, j;
static { j = 4; }
}

代码正在编译中。但在这两种情况下,变量定义都在初始化 block 之后。这背后有何奥秘?

最佳答案

您可以赋值到一个值,而不是它的声明 - 您只是不能读取它。所以这也失败了:

static { System.out.println(j + 2); }
static int j;

虽然这很好:

static { j = 5; }
static int j;

section 8.3.2.3 中的四个条件之一无效用法是:

  • 用法不在赋值的左侧。

(那部分的双重否定让我头疼,但我认为它是相关的!)

老实说,规范的那部分是我见过的最糟糕的部分之一 - 它真的不清楚。但结果是你可以赋值但不能读取:)

关于java - Java 静态初始化 block 上的奇怪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14434062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com