类加载过程
类加载过程
当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载。
(1)加载
指的是将类型的class字节码数据读入内存。
(2)连接
① 验证:校验合法性等
② 准备: 准备对应的内存(方法区)、创建Class对象,为类变量(类中的static变量)赋默认值,为静态常量 (final)赋初始化值。
③ 解析: 把字节码中的符号引用替换为对应的直接地址引用。
符号引用:
符号引用主要包含下面三类常量:
1、类和接口的全限定名(Fully Qualified Name)
2、字段的名称和描述符(Descriptor)
3、方法的名称和描述符
直接引用:
把直接替换成引用的地址
(3)初始化
initilize(类初始化) 即执行<clinit>类初始化方法,大多数情况下,类的加载就完成了类的初始化,有些情况下,会延迟类的初始化。
类的初始化执行的是<clinit>(),还方法由类变量的显示赋值代码以及静态代码块中的代码构成。
实例的初始化执行的是<init>(),实例的初始化一定晚于类的初始化
类的初始化:
(1)类的初始化就是为静态变量初始化。实际上,类初始化的过程时在调用一个<clinit>()方法,而这个方法是编译器自动生成的。编译器会将如下两部分的所有代码,按顺序合并到类初始化<clinit>()方法体中。
-
静态类成员变量的显式赋值语句
-
静态代码块中的语句
(2)每个类初始化只会进行一次,如果子类初始化时,发现父类没有初始化,那么会先初始化父类。
(3)类的初始化一定优先于实例初始化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)