我知道有很多与此问题类似的问题,但是我想对此问题进行一些详细的解释。
假设我有此代码-
public class Finalexamples {
public int num = 3;
public static int num2;
public static Finalexamples a;
public Finalexamples(){
Finalexamples.num2 = 4;
}
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
public static void main(String[] args) {
System.out.println("Starting...");
}
}
当JVM加载.class文件时,它是否首先用默认值初始化静态变量,然后在程序使用文字值运行时?
在我的示例中,静态块输出“ 4”(固定),如果可以解释为什么它不是0?
最佳答案
好的,因此Java首先转到类中最顶层的静态声明(将num2
定义为int),然后将a
定义为Finalexamples
对象。然后转到您的静态块。在静态块中,它看到a = new Finalexamples();
,因此它将通过构造函数创建a
。 (如果直到静态初始化结束时才执行此步骤,由于未构造a
,所以直到最后都无法访问a
,这不好!)因此,在变量Finalexamples.num2
的构造函数中,我们将Finalexamples.num2
设置为等于4。构造器完成,Java返回执行静态块,并打印出,现在为4。