以下代码将打印出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之前
答案 0 :(得分:1)
这里涉及的主要问题是编译代码和运行代码之间的区别。编译器确保已声明所有变量。可能它会在抽象语法树上进行两次传递,首先查找所有声明,然后检查所有使用是否有声明。
现在代码运行时,变量声明不再重要,因为在编译时需要处理。生成的字节代码执行Java源代码中定义的操作。