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

时间:2018-02-06 05:55:53

标签: java variables static static-variables static-block

以下代码将打印出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?

因为我遇到的人们所说的回答是"静态块按照它们在源代码中出现的顺序进行初始化。"

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

1 个答案:

答案 0 :(得分:1)

这里涉及的主要问题是编译代码和运行代码之间的区别。编译器确保已声明所有变量。可能它会在抽象语法树上进行两次传递,首先查找所有声明,然后检查所有使用是否有声明。

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