靜態(tài)常量和靜態(tài)變量是Java中常見(jiàn)的兩種賦值的形式另患,它們的用法十分相似纽乱,那么,它們有什么區(qū)別呢?讓我們來(lái)分析一下昆箕。
1.靜態(tài)變量
Java創(chuàng)建一個(gè)靜態(tài)變量的方式如下:
public static int a = 1;
創(chuàng)建的方式很簡(jiǎn)單鸦列,現(xiàn)在主要看jvm生成靜態(tài)變量的流程:
1.jvm類(lèi)加載進(jìn)行到準(zhǔn)備階段的時(shí)候,會(huì)初始化靜態(tài)變量鹏倘,注意薯嗤,這里的初始化是指賦值為0或者null(默認(rèn)值),而不是代碼中指定的值,如上例第股,jvm在此階段只是將a賦值為0应民。
2.jvm類(lèi)加載進(jìn)行到初始化階段,此時(shí)會(huì)將靜態(tài)變量的值賦值為代碼中指定的值夕吻,如上例诲锹,jvm在此時(shí)將a的值賦值為1。
由此可見(jiàn)涉馅,靜態(tài)變量的賦值經(jīng)歷了兩個(gè)過(guò)程归园,一個(gè)是在jvm進(jìn)行類(lèi)加載到準(zhǔn)備階段時(shí),將靜態(tài)變量初始化為默認(rèn)值稚矿,最后在jvm類(lèi)加載進(jìn)行到初始化階段時(shí)庸诱,再將代碼中指定的值賦值給靜態(tài)變量。
2.靜態(tài)常量
Java創(chuàng)建靜態(tài)常量的方式如下
public static final int a = 1;
與創(chuàng)建靜態(tài)變量的唯一區(qū)別就是多了個(gè)final關(guān)鍵字晤揣,但是jvm生成靜態(tài)常量的流程稍有不同:
1.jvm類(lèi)加載到準(zhǔn)備階段的時(shí)候桥爽,會(huì)直接將靜態(tài)常量的值直接賦值為代碼指定的值,因此昧识,靜態(tài)常量的初始化完成的比靜態(tài)變量的早钠四。
2.由于添加了final關(guān)鍵字,靜態(tài)常量在賦值以后就不能修改其值跪楞,這也符合靜態(tài)常量的特性缀去。