如何初始化一個(gè)類中的靜態(tài)成員變量?
如果不考慮父類的話,簡(jiǎn)單來(lái)說(shuō)是先進(jìn)行靜態(tài)初始化,后進(jìn)行非靜態(tài)初始化。
靜態(tài)初始化包括靜態(tài)成員變量的初始化和靜態(tài)塊,實(shí)際上編譯時(shí)都會(huì)集中到static塊中。
而非靜態(tài)初始化包括非靜態(tài)成員變量初始化和非靜態(tài)塊以及構(gòu)造方法,編譯后都會(huì)集中到構(gòu)造方法中。
如果沒(méi)有相互調(diào)用那么很簡(jiǎn)單,先進(jìn)行靜態(tài)初始化,如果靜態(tài)初始化過(guò)程中又調(diào)用后者呢?
可以寫一個(gè)代碼試驗(yàn)一下:
輸出:
可以看到確實(shí)是先進(jìn)行靜態(tài)初始化,可是中間夾雜著對(duì)于構(gòu)造方法的調(diào)用。
雖然編譯器沒(méi)有報(bào)錯(cuò),但是這種調(diào)用其實(shí)是有風(fēng)險(xiǎn)的。
因?yàn)殪o態(tài)成員變量(假設(shè)有的話)并未初始化的過(guò)程中就調(diào)用類的構(gòu)造函數(shù),假設(shè)有依賴的情況下,實(shí)際上過(guò)程是不可控的。
看下面這個(gè)例子:
能想象到這種輸出嗎?
所以如果非要在靜態(tài)初始化過(guò)程中,調(diào)用本類的構(gòu)造函數(shù)。
一定要注意初始化順序問(wèn)題,精確到語(yǔ)句。