java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
靜態(tài)變量初始化順序
1.簡(jiǎn)單規(guī)則
首先先看一段最普遍的JAVA代碼:
?
這里先猜下控制臺(tái)輸出結(jié)果是什么?
OK, 或許你已經(jīng)猜到下面了結(jié)果了,那么你還是熟悉Java的。
復(fù)制代碼 代碼如下:
0 1
如果你不明白是為什么會(huì)輸出上面的結(jié)果,那么我來(lái)告訴你。
Java靜態(tài)變量初始化遵循以下規(guī)則:
靜態(tài)變量會(huì)按照聲明的順序先依次聲明并設(shè)置為該類(lèi)型的默認(rèn)值,但不賦值為初始化的值。
聲明完畢后,再按聲明的順序依次設(shè)置為初始化的值,如果沒(méi)有初始化的值就跳過(guò)。
看了這個(gè)就會(huì)明白,原來(lái)Test.a的值變化了三次。
聲明時(shí)設(shè)置為0>>Test1::Test1里設(shè)置為1>>Test.a初始化為0
2.復(fù)雜規(guī)則
明白了這個(gè),請(qǐng)?jiān)倏聪旅娴拇a。
?
這個(gè)你還能猜到輸出結(jié)果嗎? 我是在一邊測(cè)試一邊寫(xiě)的,所以我沒(méi)猜出來(lái).哈哈
控制臺(tái)輸出結(jié)果為:
?
這個(gè)結(jié)果你沒(méi)猜到吧,哈哈.
要一句一句的講解程序執(zhí)行結(jié)果,還是要很到的篇幅的.這里就直接寫(xiě)出Java靜態(tài)變量初始化遵循的規(guī)則了。
第一段的規(guī)則依然有效,只是不健全。
只有主動(dòng)請(qǐng)求一個(gè)類(lèi),這個(gè)類(lèi)才會(huì)初始化,僅包含靜態(tài)變量,函數(shù),等靜態(tài)的東西.
繼承關(guān)系時(shí),先初始化父類(lèi),后初始化子類(lèi).
靜態(tài)變量會(huì)按照聲明的順序先依次聲明并設(shè)置為該類(lèi)型的默認(rèn)值,但不賦值為初始化的值.
聲明完畢后,再按聲明的順序依次設(shè)置為初始化的值,如果沒(méi)有初始化的值就跳過(guò).
當(dāng)初始化A.b=B.a時(shí),暫停初始化A.b,設(shè)置當(dāng)前類(lèi)為B,跳到步驟3,并執(zhí)行.
當(dāng)初始化B.plus = new A時(shí),暫停初始化B.plus,實(shí)例化A并賦值給B.plus.
當(dāng)A的構(gòu)造函數(shù)里需要獲得B.a的值時(shí),B.a還初始化并處于暫停初始化狀態(tài),直接取B.a的當(dāng)前值,不再等待B.a初始化.
final,靜態(tài)常量其實(shí)是遵循普通靜態(tài)變量的初始化的,但是在編譯時(shí),編譯器會(huì)將不可變的常量值在使用的地方替換掉.可以用Java反編譯工具查看.
static數(shù)據(jù)的初始化
加上static限定的字段,是所謂的類(lèi)字段,也就是說(shuō)這個(gè)字段的擁有者不是對(duì)象而是類(lèi)。無(wú)論創(chuàng)建多少對(duì)象,static數(shù)據(jù)都只有一份。
類(lèi)內(nèi)總是先初始化static字段,再初始化一般字段。接著初始化構(gòu)造器。但是如果不創(chuàng)建這個(gè)類(lèi)的對(duì)象,那這個(gè)對(duì)象是不會(huì)進(jìn)行初始化的,并且只執(zhí)行一次。
如下面的代碼,在StaticInitialization類(lèi)中,先初始化static Table table = new Table();,然后才去初始化Table對(duì)象,不然是不會(huì)被初始化的。
?
輸出:
?
顯示的靜態(tài)初始化(也就是靜態(tài)塊)
把多個(gè)初始化語(yǔ)句包在一個(gè)static花括號(hào)里,叫做靜態(tài)塊,其實(shí)就是把多個(gè)static合在一起寫(xiě)了,本質(zhì)是一樣的。只有首次創(chuàng)建對(duì)象或者首次訪(fǎng)問(wèn)類(lèi)的字段時(shí)才會(huì)執(zhí)行,而且僅僅一次。
?
輸出:
?
非靜態(tài)實(shí)例初始化
這個(gè)沒(méi)什么好講的,就是普通初始化,按順序執(zhí)行,可以多次執(zhí)行。
?
?
總結(jié)
以上是生活随笔為你收集整理的java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php中怎么过滤器_PHP 过滤器
- 下一篇: java treeset 转array,