常量赋值JAVA_关于类加载过程中静态常量的赋值

本文详细介绍了Java中类变量的初始化和内存分配过程。在准备阶段,类变量在方法区分配内存并设置默认零值,静态变量的赋值操作在初始化阶段执行。特殊情况是,如果类字段具有ConstantValue属性,则在准备阶段会根据该属性设置初始值。例如,final static变量在编译时就已经确定其值,并在准备阶段初始化。
摘要由CSDN通过智能技术生成

是的,而且是初始化为确定值,原文

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存

都将在方法区中进行分配。这个阶段中有两个容易产生混淆的概念需要强调一下,首先,这

时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将

会在对象实例化时随着对象一起分配在Java堆中。其次,这里所说的初始值“通常情况”下是

数据类型的零值,假设一个类变量的定义为:

public static int value=123;

那变量value在准备阶段过后的初始值为0而不是123,因为这时候尚未开始执行任何Java

方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器<clinit>()方

法之中,所以把value赋值为123的动作将在初始化阶段才会执行。表7-1列出了Java中所有基

本数据类型的零值。

上面提到,在“通常情况”下初始值是零值,那相对的会有一些“特殊情况”:如果类字段

的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为

ConstantValue属性所指定的值,假设上面类变量value的定义变为:

public static final int value=123;

编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据

ConstantValue的设置将value赋值为123。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值