Java 为什么在声明静态变量之前可以初始化它
下面的代码将打印出5Java 为什么在声明静态变量之前可以初始化它,java,variables,static,static-variables,static-block,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); } 我不明白这怎么合法。还有一些其他的链接,没有明确的答案来解释为什么会这样 因为我遇到的答案是“静态块是按照它们在源代码中出现的顺序初始化的。” 但是在本例中,在源代码中,x=5在静态final int x之前这里涉及的主要问题
static {
x = 5;
}
static final int x;
public static void main(String[] args) {
System.out.println(x);
}
我不明白这怎么合法。还有一些其他的链接,没有明确的答案来解释为什么会这样
因为我遇到的答案是“静态块是按照它们在源代码中出现的顺序初始化的。”
但是在本例中,在源代码中,x=5在静态final int x之前这里涉及的主要问题是编译代码和运行代码之间的区别。编译器确保所有变量都已声明。它可能对抽象语法树进行两次遍历,第一次查找所有声明,第二次检查所有使用是否有声明
现在,当代码运行时,变量声明不再重要,因为这是在编译时处理的。生成的字节码执行Java源代码中定义的操作。声明在编译时解析,as初始化在运行时解析。静态变量作为类加载的一部分“声明”(它属于类,而不是实例),然后执行静态块。关于这一点没有什么不清楚的。
static final int x
根本不执行。这是一个声明。@JimGarrison错了,很多(初学者)都不清楚,因为它似乎打破了块作用域变量的常规规则:使用的任何东西都应该在前面声明。谢谢大家,现在都有意义了