为什么静态字段自我赋值仅使用显式静态语法进行编译?

Gon*_*n I 9 java static initialization

为什么这个代码在右侧使用显式静态字段表示法编译,但不是没有?

public class A
{
    static int a = ++A.a;  // compiles
    //static int a = ++a;  // error - cannot reference a field before it is defined

    public static void main(String[] args) {
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 4

这就是语言规范的编写方式。具体来说,第 8.3.3 节说:

即使该字段在范围内,对字段的引用有时也会受到限制。以下规则限制对字段的前向引用(其中使用文本在字段声明之前)以及自引用(其中字段在其自己的初始值设定项中使用)。

对于通过简单名称引用在类或接口 C 中声明的类变量 f,如果出现以下情况,则为编译时错误

  • ...

强调我的。

A.a不是一个简单的名称,因此它不是编译时错误。

  • @user889742 JLS 9 中的措辞已更新。我已在此处更新。 (2认同)