在var初始化期间使用this.var

NPE*_*NPE 10 java initialization undefined-behavior

在研究另一个问题时,我惊讶地发现以下Java代码编译时没有错误:

public class Clazz {
    int var = this.var + 1;
}
Run Code Online (Sandbox Code Playgroud)

在我的JDK6中,var初始化为1.

上面的代码是否具有明确定义的语义,或者它的行为是否未定义?如果您说它定义明确,请引用JLS的相关部分.

Kep*_*pil 4

在第 8.3.2.3 节的示例 8.3.2.3-1 中顺便提到了。在文中的例子中

\n\n
class Z {\n    static int peek() { return j; }\n    static int i = peek();\n    static int j = 1;\n}\nclass Test {\n    public static void main(String[] args) {\n        System.out.println(Z.i);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

标题说:

\n\n
\n

... i 的变量初始值设定项使用类方法 peek 在 j 由其变量初始值设定项初始化之前访问变量 j 的值,此时它仍具有默认值 (\xc2\xa74.12.5)

\n
\n\n

这应该直接反映您的情况。

\n