虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析,初始化,最终形成可以被虚拟机执行的java文件。---->>类的加载机制
加载时机:
1,加载
2,验证
3,准备
4,解析
5,初始化
2~4步被称为连接;
什么时候必须进行初始化?
1,遇到new,getstatic,putstatic,invokestatic这四条指令时;生成这四条指令最 常见的java代码场景是:创建对象时(new关键字),读取和设置一个类的静态 字段(被final修饰,已在编译器把结果放入常量池的静态字段除外),以及调用 一个类的静态方法;
2,使用reflect包中的方法对,类进行反射调用的时候;
3,当初始化一个类的时候,发现父类还没有进行过初始化,则需要先触发对父类的初 始化;
4,当虚拟机启动时,用户需要指定一个主类(包括main方法),虚拟机会对其进行 初始化;
5,以上四种行为表示对该类进行主动引用;既然有主动引用也会有被动引用
被动引用例子:
//通过子类引用父类的静态字段不会导致子类的初始化
public class SuperClass
{
static
{
System.out.println("SuperClass init");
}
public static int value = "123";
}
public class SubClass extends SuperClass
{
static
{
System.out.println("SubClass init");
}
}
public static void main(String[] args)
{
System.out.println(SubClass.value);
}