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

在这里首先明确,静态static关键字和jvm虚拟机常量池是两个概念。

只是static关键字修饰常量或者变量,会在类实例化之前就放在常量池中而已。

 

static关键字

由static修饰的变量,常量和方法被称为静态变量,常量和方法。

final关键字

由final修改的为常量。由final和static共同修饰的为静态常量

 

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

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

public class StaticClass {  

    static {  
        System.out.println("StaticClass loading...");  
    }  
      
    public static String VALUE = "static value loading";  
      
    public static final String FIANL_VALUE = "fianl value loading"; 
    
    public static final int FINAL_VALUE_INT = new Random(66).nextInt(); 
}  

StaticClassLoadTest类用于测试静态变量的加载:

public class StaticClassLoadTest {  
    
    public static void main(String[] args) {  
        System.out.println("StaticClassLoadTest...");  
        printStaticVar();  
    }  
      
    private static void printStaticVar() {  
//    	System.out.println(StaticClass.FINAL_VALUE_INT);//这个因为是随机数,需要出发类加载
        System.out.println(StaticClass.FIANL_VALUE);  //这个因为是一个常量,不需要类加载就能得到
        System.out.println(StaticClass.VALUE);  
    }  
      
} 

输出:

  1. StaticClassLoadTest...
  2. fianl value loading 
  3. StaticClass loading...  
  4. static value loading 

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

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

57d8583e64d914328fdde6d38a50b3eb155.jpg

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

public static final int FINAL_VALUE_INT = new Random(66).nextInt();  

转载于:https://my.oschina.net/u/1458864/blog/1987774

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值