Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在声明静态变量之前可以初始化它_Java_Variables_Static_Static Variables_Static Block - Fatal编程技术网

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

Java 为什么在声明静态变量之前可以初始化它,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之前这里涉及的主要问题

下面的代码将打印出5

  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错了,很多(初学者)都不清楚,因为它似乎打破了块作用域变量的常规规则:使用的任何东西都应该在前面声明。谢谢大家,现在都有意义了