类的加载顺序
一个类,如果要在JVM中运行,需要执行以下步骤:

具体的加载步骤:

类加载的步骤
1.加载
将class文件中的内容,使用IO流读取到JVM所在的内存空间
加载时,需要使用到3个类加载器,分别是:根类加载器,扩展类加载器,系统类加载器
根类加载器 是C语言编写的,他们3个之间存在父子关系

类加载的具体流程
1、java.exe程序搜索jre目录,寻找JVM.dll,并启动JVM。
2、JVM运行根类加载器,该根类加载器加载Java核心API。
3、根类加载器运行后,它会自动加载扩展类加载器和系统类加载器,并将扩展类加载器的父类设置为根类加载器,将应用加载器的父类设置为扩展类加载器。
4、扩展类加载器加载搜索JAVA_HOME/jre/lib/ext目录,加载扩展API。
5、应用加载器搜索CLASSPATH目录,加载我们要运行的类。
6、类的class文件读入内存后,就会创建一个java.lang.Class对象。也就是说,当Java程序中使用任何类时,系统都会为之创建一个java.lang.Class对象。一旦某个类被载入JVM中,同一个类就不会再次被载入。
注意:一旦某个类被载入JVM中,同一个类就不会再次被载入。
2.连接
当类被加载后,系统就为之创建一个对应的Class对象,接着就会进入连接阶段。连接阶段会负责把类的二进制数据合并到JRE中。
连接的3个阶段
类的连接,也可以分为三个阶段:
验证: 判断class中的内容,能否运行在当前JVM版本上,你不要做JDK1.8的代码,放到JDK1.7去运行
准备:给static修饰的类变量赋初值,基本数据类型赋值为0,引用数据类型复制为null
解析:将类的二进制数据中的符号引用替换成直接引用
3.初始化
类初始化,第一个事情,就是针对静态常量赋初始值,例如PI = 3.14;
第二个事情,执行类中 由static修饰的 静态初始化块代码
初始化的步骤
1) 假如这个类还没有被加载和连接,程序先加载并连接该类。
2) 假如该类的直接父类还没有被初始化,则先初始化其直接父类。
3) 假如该类中有初始化语句,则系统依次执行这些初始化语句
类的加载机制-双亲委派

为什么要用双亲委派?
为了防止程序员乱写核心代码,或者扩展代码
例:
如果有人写了一个String类,并提供了多个方法,并且和lang包下的String冲突
此时加载自定义的String类时,【系统类加载器】会委托上一层的父类【扩展类加载器】加载代码,【扩展类加载器】又会委托上一次的【根类加载器】进行加载,此时【根类加载器】发现已经在程序开始的时候就加载了核心代码String类,所以同名的String类不会被加载
类需要初始化的6种情况
1、创建类的实例。
2、调用某个类的静态方法。
3、访问某个类或接口的静态属性,或者为静态属性赋值。
4、使用反射方式强制创建某个类或接口对应的java.lang.Class对象。
5、初始化某个类的子类。
6、直接使用java.exe命令运行某个主类。
