再谈JVM中类的加载过程--初始化

77 阅读1分钟

类初始化

当经过了加载、链接两个阶段以后,才开始正式进入初始化阶段,在这个阶段是正式进入了java代码准确地说是字节码的执行环节,执行的是< clinit >方法,这个方法中做的主要是静态变量的显式赋值以及静态代码块的执行。要注意一点,clinit方法是正式执行字节码的环节,这一点在接下来的叙述中十分重要
其实并不是说只有类变量才可以在类的初始化环节进行初始化,准确地说,应该是需要执行字节码的变量会在这个初始化环节进行初始化例如如下的几行代码

public static int age = 10;
public static final String name = new String("zzw");

这两行代码都会在类的初始化环节进行执行,虽然第二行代码是用final进行修饰的。原因是new String对象 需要执行四行字节码。因此只能放在clinit里面进行执行。

线程安全

这个类初始化方法,即clinit方法 是一个线程安全的方法,即不能多个线程同时访问这个方法,同时这个方法也仅仅只能加载一次。

是否执行

其实对于类的初始化方法并不是必须的,可以这样理解,初始化方法相当于是一个执行字节码的操作,但其实这个操作可以选择不做,因此出现了两个具体的区分,类的主动使用和被动使用,分别对应着是否执行clinit方法。