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

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:
Java对于static final修饰的常量的处理_第1张图片
A$B.class:
Java对于static final修饰的常量的处理_第2张图片
可以看到, 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编译, 反编译查看:
Java对于static final修饰的常量的处理_第3张图片
可以看到,常量AA的引用被替换为值,但是其定义还是被保留了下来。

你可能感兴趣的:(java特性)