初始化才是真正的执行类中定义的Java代码,在准备阶段已经进行过初始化了变量,那么初始化就是clinit()方法的执行过程
clinit方法中,就是讲所有类变量的赋值动作和静态语句块合并产生的,编译器收集器的顺序和源文件的顺序一致,静态语句块只能访问到静态语句块之前的变量,可以赋值之后的,但不能直接访问,如下所示
虚拟机可以保证在子类的clint方法执行之前,父类的clint方法已经执行完成,于是可以推断得出第一个类是Object类
如果这个类没有需要被赋值的静态代码块,那么可以不执行clinit方法
对于接口,那么不要求在执行子接口的时候必须执行父接口的clinit方法
在虚拟机中,如果多个线程初始化一个类的时候,只有一个线程去执行这个类的clinit()方法,其他线程都将等待