一、类的初始化顺序

静态变量(这里涉及到类的加载阶段(装载阶段,链接阶段,初始化阶段))
静态块
实例变量
实例块
构造函数

二、类的加载过程

是指将.class字节码文件(在磁盘上)通过java解释器加载到JVM的过程

1.类加载时机

(1)new,静态属性,静态方法调用
(2)获取class对象
(3)加载子类时需要提前加载父类
(4)启动JVM,main函数所在的类需要加载

2.类的加载过程

第一大阶段:装载阶段
启动类加载器 Boostrap ClassLoader:它负责加载jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
扩展类加载器 Ext ClassLoader :它负责加载jre/lib/ext.jar中的类。由Java语言实现,父类加载器为null。
应用类加载器 Application ClassLoader:它负责在JVM启动时加载来自CLASSPATH的路径。

(1)双亲(parent)委派模型

从子类到父类,从APP到Boo类依次查找之前是否加载过这个类,如果加载过返回加载后的产物(class对象)。如果当前类加载器没有加载过这个类,依次在其父类中找
从Boo到App,从父类到子类依次尝试加载

(2)加载结果

路径找不到加载失败 ClassNotFoundException
加载成功的产物:当前类的Class对象(保存当前类的类信息)在Java堆(jdk>=1.6)

(3)类加载器加载Class大致要经过如下8个步骤:

1.检测此Class是否载入过,即在缓冲区中是否有此Class,如果有直接进入第8步,否则进入第2步。
2.如果没有父类加载器,则要么Parent是根类加载器,要么本身就是根类加载器,则跳到第4步,如果父类加载器存在,则进入第3步。
3.请求使用父类加载器去载入目标类,如果载入成功则跳至第8步,否则接着执行第5步。
4.请求使用根类加载器去载入目标类,如果载入成功则跳至第8步,否则跳至第7步。
5.当前类加载器尝试寻找Class文件,如果找到则执行第6步,如果找不到则执行第7步。
6.从文件中载入Class,成功后跳至第8步。
7.抛出ClassNotFountException异常。
8.返回对应的java.lang.Class对象。
第二阶段 链接阶段
验证:符合虚拟机要求,不能危害虚拟机安全,文件格式,主次版本号验证
准备:给静态变量开辟内存(4字节内存)并赋类型默认值0
解析:虚拟机将常量池内的符号引用替换为直接引用
第三阶段 初始化阶段 :给静态变量赋值阶段