靜態(tài)常量和靜態(tài)變量是Java中常見的兩種賦值的形式,它們的用法十分相似,那么,它們有什么區(qū)別呢?讓我們來分析一下。
1.靜態(tài)變量
Java創(chuàng)建一個靜態(tài)變量的方式如下:
public static int a = 1;
創(chuàng)建的方式很簡單,現(xiàn)在主要看jvm生成靜態(tài)變量的流程:
1.jvm類加載進行到準備階段的時候,會初始化靜態(tài)變量,注意,這里的初始化是指賦值為0或者null(默認值),而不是代碼中指定的值,如上例,jvm在此階段只是將a賦值為0。
2.jvm類加載進行到初始化階段,此時會將靜態(tài)變量的值賦值為代碼中指定的值,如上例,jvm在此時將a的值賦值為1。
由此可見,靜態(tài)變量的賦值經(jīng)歷了兩個過程,一個是在jvm進行類加載到準備階段時,將靜態(tài)變量初始化為默認值,最后在jvm類加載進行到初始化階段時,再將代碼中指定的值賦值給靜態(tài)變量。
2.靜態(tài)常量
Java創(chuàng)建靜態(tài)常量的方式如下
public static final int a = 1;
與創(chuàng)建靜態(tài)變量的唯一區(qū)別就是多了個final關(guān)鍵字,但是jvm生成靜態(tài)常量的流程稍有不同:
1.jvm類加載到準備階段的時候,會直接將靜態(tài)常量的值直接賦值為代碼指定的值,因此,靜態(tài)常量的初始化完成的比靜態(tài)變量的早。
2.由于添加了final關(guān)鍵字,靜態(tài)常量在賦值以后就不能修改其值,這也符合靜態(tài)常量的特性。