1.类加载的全过程分为三个阶段
1.加载
意思是将class文件内容加载到内存中,将其转换为方法区中的运行时数据结构和在堆中生成一个C代表这个类的java.lang.Class对象,作为方法区的访问入口
2.链接-----》分为三个部分
1.验证 确保加载的类信息符合JVM规范,没有安全方面的问题
2.准备 正式为类变量(static变量)分配内存并设置类变量的初始化值得阶段 这些内存都在方法区中进行分配
3.解析 虚拟机常量池中得符号引用直接替换为直接引用过程
3.初始化
就是将静态变量(静态域)和静态块执行类构造器方法---就是将两个语句合并执行
-
当发现这个父类还进行初始化时,先对父类进行初始化
2.类如何才会进行初始化
1.类的主动引用
- new 一个对象
- 使用类的静态成员和静态方法
- 虚拟机执行主函数main所在的类
- 当初始化一个类的时候,如果父类没有初始化,则会优先初始化父类
2.类的被动引用
1.当访问一个静态域时,只有真正声明这个域的类才会被初始化 - 通过子类调用父类的静态变量时,不会导致子类被初始化
2.通过数组定义 产生类的对象
3.引用常量不会产生 (调用了常量池里的常量)
一个类只能初始化一次