为什么可以在声明静态变量之前对其进行初始化

Why can you Initialize a static variable before declaring it

下面这段代码将打印出 5。

  static {
    x = 5;
  }
  static final int x;
  public static void main(String[] args) {
    System.out.println(x);

  }

虽然我不明白这是怎么合法的。还有一些其他链接,没有明确回答为什么这有效

Which will be loaded first static variable or static block?

Which will be loaded first static block or static variable?

因为我遇到的人说的答案是 "static blocks are initialized in the order they appear in the source code."

但在这种情况下,x = 5 在源代码中出现在 static final int x 之前

这里涉及的主要问题是编译代码和 运行 代码之间的区别。编译器确保所有变量都已声明。可能它对抽象语法树进行了两次遍历,首先是找到所有声明,其次是检查所有使用是否有声明。

现在当代码运行时,变量声明不再重要,因为它在编译时就已经处理好了。生成的字节码执行 Java 源代码中定义的操作。