本文参考《深入理解java虚拟机》

虚拟机加载类的过程:

java源程序被编译器编译成class文件后,会被虚拟机的类加载器加载,加载完成后,会为class文件在内存中开辟一块空间用来存储class文件对象,之后对class文件进行校验,准备,解析和初始化,最终形成能被虚拟机使用的java类型,这叫做类加载过程。

过程:

校验:检验class文件的正确性,判断class文件是否对虚拟机的安全造成威胁。

准备:为类成员分配内存空间,值得注意的是,会给静态属性默认赋值,比如 static int a,a的值在内存中默认是0。

解析:将符号引用转为直接引用。

初始化:为准备阶段的类成员赋于我们定义的值。

 

类加载过程图:

什么时候进行初始化?

1.使用putstatic,new,getstatic,invokestatic这四个字节码命令时进行初始化。

2.子类初始化时需要先把父类初始化。

3.对类进行反射调用时

4.含有主方法的类要被初始化

初始化要点

对于静态字段只有直接定义这个静态字段的类会被初始化。

package com.yqg.test;

public class Cat extends Dog{
       static {
           System.out.println("我是九尾");
       }
}

package com.yqg.test;

public class Dog {
    
    public static  int value = 2;
    static {
        System.out.println("我是神犬");
    }
    
}

package com.yqg.test;

public class Test {
       public static void main(String[] args) {
        System.out.println(Cat.value);
    }
}

结果:

我是神犬
2