1) 装载:
查找并加载类的二进制数据;
2)链接:
验证: 确保被加载类的正确性;
准备: 为类的静态变量分配内存, 并将其初始化为默认值;
解析: 把类中的符号引用转换为直接引用;
3)初始化:
为类的静态变量赋予正确的初始值;
准备阶段和初始化阶段看似有点矛盾, 其实是不矛盾的, 如果类中有语句: private static int a =10,它的执行过程是这样的, 首先字节码文件被加载到内存后, 先进行链接的验证这一步骤, 验证通过后准备阶段,
给 a 分配内存, 因为变量 a 是 static 的, 所以此时 a 等于 int 类型的默认初始值 0, 即 a=0,然后到解析( 后面在说) ,
到初始化这一步骤时, 才把 a 的真正的值 10 赋给 a,此时 a=10。
类什么时候才被初始化:
1) 创建类的实例, 也就是 new 一个对象
2) 访问某个类或接口的静态变量, 或者对该静态变量赋值
3) 调用类的静态方法
4) 反射( Class.forName("com.lyj.load"))
5) 初始化一个类的子类( 会首先初始化子类的父类)
6) JVM 启动时标明的启动类, 即文件名和类名相同的那个类
只有这 6 中情况才会导致类的类的初始化。
类的初始化步骤:
1) 如果这个类还没有被加载和链接, 那先进行加载和链接
2) 假如这个类存在直接父类, 并且这个类还没有被初始化( 注意: 在一个类加载器中, 类只能初始化一次) ,
那就初始化直接的父类( 不适用于接口)
3) 加入类中存在初始化语句( 如 static 变量和 static 块) , 那就依次执行这些初始化语句。
因篇幅问题不能全部显示,请点此查看更多更全内容