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$B.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编译, 反编译查看:
可以看到,常量AA的引用被替换为值,但是其定义还是被保留了下来。