Java类加载机制--类加载过程(准备)

本文详细解析Java虚拟机加载类的准备阶段,解释类变量内存分配与初始值设定过程,区分实例变量与类变量的区别,并说明特殊情况下初始值的赋值原则。

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

Java虚拟机加载类的全过程包括:加载、验证、准备、解析、初始化。验证、准备、解析叫连接过程。今天我们讲准备。

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区内进行分配。这个阶段中有两个容易产生混淆的概念需要强调一下。首先,这时候仅对类变量(被static修饰的变量),进行内存分配。不会对实例变量进行分配,实例变量将在对象实例化时随着对象一起被分配在java堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量定义为:

public static int value = 456;

那么value在准备阶段过后的初始值是0,不是456。因为这个时候未开始执行任何java方法,而把value赋值的putstatic指令是程序被编译后,存放于类构造器()方法中,所以把value赋值的动作将在初始化阶段执行。

上面提到了“通常情况”下是零值,那么相对而言肯定有“特殊情况”下是非零值:如类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为ConstantValue属性所指定的值,假设上面的value被定义为:

public static final int value =456;

那么编译时javac将会为value生成ConstantValue属性,在准备阶段就将value赋值为456.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值