加载->链接(验证->准备->解析)->初始化
加载:
.class文件先通过类加载器,在方法区(Java8以前是永久代,Java8以后以元空间 落地实现)形成类结构(也叫类模板),再通过镜像在堆中形成Class类封装方法区的数 据结构。
链接:
1.验证:格式检查(例如魔数、版本、长度)、语义检查、字节码验证、符号引用 检 查;
2.准备:为类中静态变量分配内存空间,为基本数据类型的静态变量默认赋值,为基本数据类型的static final显式赋值,为引用类型的变量不管加不加static final都默认赋值,String较为特别,为字面量创建的String变量显示赋值,为new出来的String变量默认赋值;
3.解析:将符号引用变成直接引用;
初始化:
真正执行代码的阶段,为基本数据类型的静态变量显式赋值,为引用类型的变量显式赋值,为new出来的String变量显式赋值;
ps:静态变量(类变量)在链接和准备阶段初始化;
成员变量是在类的使用的赋值。