类加载的过程


前言

最近在牛客刷题,经常会遇到一些类、对象加载初始化的一些很细微的问题,似懂非懂。

知识概念


加载:简单来说就是通过类的全限定名称获取数据并在堆中创建一个对象作为数据访问入口

验证:检验Class文件数据信息是否符合虚拟机的要求

准备:此阶段是对类变量进行分配内存和初始化(注意:此处初始化是给系统默认值即零值(一般情况),真正的赋值在上图中的初始化阶段。特殊情况:被final修饰的类变量如public static final int test = 1;此时就直接赋值为1了

解析:对字段、方法、接口进行解析,这个交给虚拟机来完成,不必过多深究。

初始化:真正开始执行java中的程序代码,例如:对类变量进行初始化,执行静态代码块等

注意:上图5个过程除了解析过程其他过程都是要按照图中顺序开始,(注意:这里的顺序不是一定要等前面一个过程完成后才开始下一个过程),解析过程可以在加载的时候也可以在初始化的时候,这个交给虚拟机来判断。

初始化时机


1、new实例化对象的时候(注:类未被加载过)。

2、引用静态变量

3、引用静态方法

4、使用反射

5、初始化当前类的父类(如果存在)未被加载过

6、主类(main方法)

附加:实例对象加载过程



从面两个过程图我们可以清楚的知道为什么成员变量和类变量可以不用赋初值(类变量会在准备阶段赋值零值,成员变量会在调用构造函数的时候初始化),而局部变量需要赋初值。