我知道有很多与此问题类似的问题,但是我想对此问题进行一些详细的解释。

假设我有此代码-

 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。

10-04 17:27