Java对于static final修饰的常量的处理

本文围绕Java中static final修饰的常量的处理展开。作者通过编写测试代码,在jdk1.8环境下编译运行,使用jd - gui查看class文件,发现javac编译时会对public static final修饰的变量进行值替换且保留定义,对private static final常量也是引用替换为值,定义保留。

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

Java对于static final修饰的常量的处理

比较纠结static final int A = 0; 中A在java编译时会怎么处理,于是写了一个测试
代码如下:

//文件名A.java
public class A {
	
	public static final int AA = 0;
	
	public static void main(String[] args){
		int d = AA;
		int e = B.BB;
		System.out.println(d + " " + e);
	}
	
	class B {
		public static final int BB = 0;
	}
}

jdk版本是1.8, 使用javac A.java编译后生成了两个文件: A.class和A$B.class,一切正常,java A运行,输出:

0 0

也正常。
使用jd-gui查看class文件,如下:
A.class:
A.class
A$B.class:
AB.class
可以看到, javac 在编译时将 public static final修饰的变量进行了值替换,但其定义被保留了下来。
那如果是private static final呢? 测试一下:

public class A {
	
	private static final int AA = 0;
	
	public static void main(String[] args){
		int d = AA;
		int e = B.BB;
		System.out.println(d + " " + e);
	}
	
	class B {
		public static final int BB = 0;
	}
}

还是原来的代码,只不过将其中一个public修改为private。
javac编译, 反编译查看:
2
可以看到,常量AA的引用被替换为值,但是其定义还是被保留了下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值