试图在初始化之前展开app常量_JVM 解剖公园(14): 常量

本文探讨了Java中final字段的初始化及其作为常量的特性,指出常量字段在编译和运行时如何被优化,影响类初始化、二进制兼容性和性能。实验结果显示,final字段的访问在性能上优于非final字段,因为它们在字节码级别可能被内联。然而,对于非初始化的final字段,性能表现则与非final字段相近。
摘要由CSDN通过智能技术生成

(给ImportNew加星标,提高Java技能)

编译:ImportNew/唐尤华

shipilev.net/jvm/anatomy-quarks/14-constant-variables/

1. 写在前面

“JVM 解剖公园”是一个持续更新的系列迷你博客,阅读每篇文章一般需要5到10分钟。限于篇幅,仅对某个主题按照问题、测试、基准程序、观察结果深入讲解。因此,这里的数据和讨论可以当轶事看,不做写作风格、句法和语义错误、重复或一致性检查。如果选择采信文中内容,风险自负。

Aleksey Shipilёv,JVM 性能极客

推特 @shipilev

问题、评论、建议发送到 aleksey@shipilev.net"">aleksey@shipilev.net

2. 问题

实例中 final 字段是不是常量?

3. 理论

假如你读过 Java 语言规范中关于 final 变量语义的描述,会发现一段诡异的描述:

>

 常量(Constant Variable)指使用常量表达式(§15.28)初始化的 final 变量,其类型为原始类型或 String。一个变量否为常量可能对类初始化(§12.4.1)、二进制兼容性(§13.1, §13.4.9) 和明确赋值(§16)产生影响。 

— Java 语言规范 4.12.4 

>

上述影响能够通过实验观察吗?

4. 实验

思考下面代码的输出是什么?

import java.lang.reflect.Field;
public class ConstantValues {
final int fieldInit = 42;
final int instanceInit;
final int constructor;
{
instanceInit = 42;
}
public ConstantValues() {
constructor = 42;
}
static void set(ConstantValues p, String field) throws Exception {
Field f = ConstantValues.class.getDeclaredField(field);
f.setAccessible(true);
f.setInt(p, 9000);
}
public static void main(String... args) throws Exception {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值