1.加载
javac将.class编译成字节码文件,然后由类加载器加载到方法区中,加载过程就完成了。
2.连接
(1)验证
验证类是否符合JVM规范
(2)准备
为static变量分配空间,赋值在初始化阶段,但如果是基本数据类型,在这个阶段。如果是引用数据类型,则在初始化阶段
(3)解析
将常量池中的符号引用改为直接引用
3.初始化
发生的时机:
1.main方法所在的类总是会被先初始化
2.首次访问这个类的静态变量或静态方法
3.子类初始化,但是父类还没有初始化
4.class.forname
不会发生的时机:
访问类的static final (基本数据类型和字符串)不会触发
类对象.class不会触发初始化
创建该类的数组
类加载器加载字节码文件
需要注意的是,在加载和初始化类这一步中,如果该类有父类且父类还没有被加载和初始化,那么会先触发父类的加载和初始化。如果该类还有静态代码块,那么静态代码块也会在这个过程中被执行。