java类加载顺序

本文详细介绍了Java类的加载过程,包括加载、验证、准备、解析、初始化、使用和卸载七个阶段。重点讲解了每个阶段的主要任务,如类变量的初始化、常量池引用的解析及类对象的初始化顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在java中类的加载、初始化都是在程序运行期完成的,虽然会稍微增加开销,但是却很大的增加了灵活性,我们可用在运行期间动态的去网络或其他地方加载一个二进制流来作为程序代码的一部分。接下来我们简单介绍下java类加载过程。
在这里插入图片描述
从上图中我们可以看到类的生命周期主要有7个过程,分别为加载、验证、准备、解析、初始化、使用、卸载。

  1. 加载
    这个过程很简单,就是通过ClassLoader去加载Class文件到内存中,当然Class文件的来源并没有任何限制,既可以是我们的程序通过javac编译器生成的,也可以来源于网络等其他途径。
  2. 验证
    这个过程主要就是对Class文件中的字节流进行检查,看看是否符合规范,是否存在安全问题等等。
  3. 准备
    这个过程主要是为类变量(static修饰的变量)分配内存并设置初始值,此时的初始值指的是通常情况下的零值,例如private static int a = 3,类变量a在这个阶段会被赋值为0。唯一例外的类变量是使用final修饰的类变量,使用final修饰的类变量会在这个阶段就赋给程序中设定的值。
  4. 解析
    这个阶段主要将Class文件中对常量池的引用转为直接内存引用,举个简单的例子:我们常会在代码中使用import xxx.xxx.xxx.class,这里面的xxx.xxx.xxx.class就是符号引用,解析阶段就是把这种符号引用转换为对xxx.class具体内存地址的引用。
  5. 初始化
    这个阶段主要负责初始化类对象(Class对象),会按照在文件中出现的顺序为所有类变量赋值,同时执行静态代码块。千万注意这里初始化的是类对象而不是实例对象!
  6. 使用、卸载
    这两个阶段就没啥可介绍的了,就是我们程序使用对象的过程,和对象生命周期结束后进行类型卸载的过程。

最后总结下对象静态属性/实例属性初始化的顺序:
(1)父类和子类的final static属性初始化
(2)父类的static属性初始化、父类的static代码块 (两者按在文件中的声明顺序先后初始化)
(3)子类的static属性初始化、子类的static代码块 (两者按在文件中的声明顺序先后初始化)
(4)父类的非静态属性、父类的非静态代码块 (两者按在文件中的声明顺序先后初始化)
(5)父类的构造函数执行
(6)子类的非静态属性、 子类的非静态代码块 (两者按在文件中的声明顺序先后初始化)
(7)子类的构造函数执行

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斜阳雨陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值