如何在静态变量和块之间执行执行顺序?

Vas*_*nth 5 java static scope static-block static-variables

考虑以下场景:
代码:1

public class StaticDemo {
    static{
        b=5;
        System.out.println("Static B:"+b);/*Compilation error:"Cannot reference a field before it is defined"*/
    }
    static int b;
    static{
        System.out.println("B:"+b);
    }
    public static void main(String[] args) {    
    }
}
Run Code Online (Sandbox Code Playgroud)

注释下面的代码,没有错误,并且显示了以下输出.
代码:2

public class StaticDemo {
    static{
        b=5;
        //System.out.println("Static B:"+b);
    }
    static int b;
    static{
        System.out.println("B:"+b);
    }
    public static void main(String[] args) {    
    }
}
Run Code Online (Sandbox Code Playgroud)

输出 -

B:5
Run Code Online (Sandbox Code Playgroud)

如果执行基于静态变量或块的写入顺序.

  1. 为什么初始化(b=5)没有抛出编译错误,如代码所示:2.

  2. 并且还请解释为什么Code:1抛出错误,如果Code:2为真?

Ian*_*rts 3

来自Java 语言规范 \xc2\xa78.3.2.3

\n\n
\n

仅当成员是类或接口 C 的实例(分别是静态)字段并且满足以下所有条件时,成员的声明才需要在使用之前以文本形式出现:

\n\n
    \n
  • 该用法发生在 C 的实例(分别为静态)变量初始值设定项或 C 的实例(分别为静态)初始值设定项中。
  • \n
  • 用法不在赋值的左侧。
  • \n
  • 用法是通过一个简单的名称。
  • \n
  • C 是包含用法的最内部类或接口。
  • \n
\n\n

如果不满足上述四个要求中的任何一个,则会出现编译时错误。

\n\n

[...]

\n\n

上述限制旨在在编译时捕获循环或其他格式错误的初始化

\n
\n\n

换句话说,可以写入稍后在类中声明的字段,但不能从中读取。

\n\n

在我引用的部分之后的示例框中有更详细的示例。

\n