代码之家  ›  专栏  ›  技术社区  ›  katiex7

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

  •  1
  • katiex7  · 技术社区  · 7 年前

    下面的代码将打印出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 回复  |  直到 7 年前
        1
  •  1
  •   Code-Apprentice    7 年前

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

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