执行初始化程序块和变量定义等的顺序是什么?(在java中)

Unt*_*led 10 java block initializer

我有理解初始化发生顺序的问题.这是我假设的顺序:

*Once per 
    1. Static variable declaration
    2. Static block
*Once per object
    3. variable declaration
    4. initialization block
    5. constructor
Run Code Online (Sandbox Code Playgroud)

但根据这段代码,我显然是错的:

    class SomethingWrongWithMe
    {
        {
            b=0;         //no. no error here.
            int a = b;   //Error: Cannot reference a field before it is defined.
        }
        int b = 0;
    }
Run Code Online (Sandbox Code Playgroud)

如果我这样做,错误就会消失:

    class SomethingWrongWithMe
    {
        int b = 0;
        {
            b=0;
            int a = b;   //The error is gone.
        }
    }
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么没有错误

    b=0;
Run Code Online (Sandbox Code Playgroud)

Sim*_* G. 4

Java 语言规范(第 8.3.2.3 节)规定,您可以在表达式的左侧使用变量,即在声明变量之前对其进行赋值,但不能在右侧使用它。

所有变量都初始化为其默认值,然后显式初始化程序和匿名块按照在源文件中找到的顺序运行。最后调用构造函数。

静态仅在第一次使用类时运行一次。

编译错误似乎是 Java 的一条规则,而不是在每种情况下都必然有意义的东西。