Java中静态常量和静态变量的区别

时间:2022-04-19 19:30:02

如下:测试java中静态常量和静态变量区别的样例,表明两者加载时的区别。

StaticClass类中定义了静态常量FIANL_VALUE和静态变量VALUE,静态代码块的打印语句表示类被加载:

[java]  view plain  copy
  1. public class StaticClass {  

  2.     static {  
  3.         System.out.println("StaticClass loading...");  
  4.     }  
  5.       
  6.     public static String VALUE = "static value loading";  
  7.       
  8.     public static final String FIANL_VALUE = "fianl value loading";  
  9. }  

StaticClassLoadTest 类用于测试静态变量的加载:
[java]  view plain  copy
  1. public class StaticClassLoadTest {  
  2.       
  3.     public static void main(String[] args) {  
  4.         System.out.println("StaticClassLoadTest...");  
  5.         printStaticVar();  
  6.     }  
  7.       
  8.     private static void printStaticVar() {  
  9.         System.out.println(StaticVar.FIANL_VALUE);  
  10.         System.out.println(StaticVar.VALUE);  
  11.     }  
  12.       
  13. }  

输出:

[plain]  view plain  copy
  1. StaticClassLoadTest...
  2. fianl value loading 
  3. StaticClass loading...  
  4. static value loading 

输出显示在打印静态常量时,StaticVar类并没有被加载,在输出静态变量的前才打印类加载信息。这表明类的未加载的情况下也能引用其静态常量信息,原因是因为常量值存储在JVM内存中的常量区中,在类不加载时即可访问。

注:经过编译优化,静态常量 FIANL_VALUE 已经存到NotInit类自身常量池中,不会加载StaticClass  

Java中静态常量和静态变量的区别

但是不能说所有的静态常用访问都不需要类的加载,这里还要判断这个常量是否属于“编译期常量”,即在编译期即可确定常量值。如果常量值必须在运行时才能确定,如常量值是一个随机值,也会引起类的加载,如下:

[java]  view plain  copy
  1. public static final int FINAL_VALUE_INT = new Random(66).nextInt();