原来一直不太清楚static final String HELLO="hello"和static String HELLO="hello"的具体区别,现具体例子说明一下:
public class ConstClass {
static{
System.out.println("Const Class init!");
}
//public static String HELLO = "hello"; (1)
//public static final String HELLO = "hello"; (2)
}
public class NotInitExample {
public static void main(String[] args) {
System.out.println(ConstClass.HELLO);
}
}
如果运行(1),输出结果是
Const Class init!
hello
如果运行(2),输出结果是
hello
(2)在java源码编译阶段就将常量的值"hello"存储到了NotInitExample类的常量池中,对ConstClass.HELLO的引用都被转化为NotInitExample类对自身常量池的引用。在编译后,这两个类就不存在任何关系了。
(1)的输出结果表明,在NotInitExample类调用ConstClass.HELLO的时候,ConstClass类已经被加载初始化了。所以在定义常量字段的时候建议用static final,这样使得在调用静态字段的时候不用再初始化类,减少开销。