对于final类型的静态变量,如果该变量的值在编译期就可以确定下来,那么该静态变量相当于”宏变量”。Java编译器会在编译期直接将该变量出现的地方替换成它的值。因此即使程序使用该静态变量,也不会导致该类的初始化。
总结:使用在编译器就能够确定值的静态常量不会初始化类
示例代码
public class Share {
static {
System.out.println("loading Share");
}
public static final int share = 23;
}
public class Test {
public static void main(String[] args) {
System.out.println(Share.share);
}
}
运行测试类,可以发现Share类没有被加载,而将关键字final去掉以后运行,则能看到加载Share类的输出语句。之所以会出现这种现象是因为,程序在使用的时候,并没有使用该静态变量,而是直接使用了常量。
反之,如果该静态常量的值在编译期间不能够确定,必须在运行时才能够确定,这个时候如果访问它,则会导致类的初始化。
示例代码
public class Share {
static {
System.out.println("loading Share");
}
public static final String CUR_TIME = System.currentTimeMillis() + "";
}
public class Test {
public static void main(String[] args) {
System.out.println(Share.CUR_TIME);
}
}
这种情况之所以会导致Share类的初始化是因为Share类的CUR_TIME的值必须在运行时才能确定,所以Share类必须保留对于CRU_TIME变量的引用,这个时候CRE_TIME其实就称为了静态变量,而使用类的静态变量则会初始化类。