static變量只能初始化一次嗎 static變量什么時(shí)候初始化?
static變量什么時(shí)候初始化?只執(zhí)行一次復(fù)制:可以添加到學(xué)生類(lèi)的構(gòu)造函數(shù)中,例如:運(yùn)行時(shí)會(huì)發(fā)現(xiàn)只打印一次大致原理:靜態(tài)變量是類(lèi)變量,第一次使用類(lèi)時(shí)只初始化一次。類(lèi)裝入器中會(huì)有一個(gè)鎖,以防止類(lèi)被多次初
static變量什么時(shí)候初始化?
只執(zhí)行一次
復(fù)制:
可以添加到學(xué)生類(lèi)的構(gòu)造函數(shù)中,例如:
運(yùn)行時(shí)會(huì)發(fā)現(xiàn)只打印一次
大致原理:
靜態(tài)變量是類(lèi)變量,第一次使用類(lèi)時(shí)只初始化一次。類(lèi)裝入器中會(huì)有一個(gè)鎖,以防止類(lèi)被多次初始化。靜態(tài)字段和靜態(tài)代碼塊只執(zhí)行一次。從編譯器的角度來(lái)看,編譯時(shí)編譯器會(huì)按順序收集靜態(tài)字段和靜態(tài)代碼塊,然后將其放入生成的<cinit>特殊方法中,初始化類(lèi)時(shí)會(huì)調(diào)用<cinit>方法。
應(yīng)用程序:
對(duì)于您的問(wèn)題:
在前一個(gè)線程初始化之后,判斷它是否已成功初始化,并直接獲取結(jié)果
您的問(wèn)題有點(diǎn)有趣。前一個(gè)線程的初始化可以說(shuō)是取鎖,然后執(zhí)行鎖代碼。當(dāng)鎖退出時(shí),鎖代碼的結(jié)果將完全同步,這是鎖的一個(gè)特性(比如內(nèi)存可見(jiàn)性)。然后下一個(gè)字段結(jié)果就是正常結(jié)果
靜態(tài)int只初始化一次,但可以多次修改。靜態(tài)變量屬于靜態(tài)存儲(chǔ)模式。它的存儲(chǔ)空間是內(nèi)存中的靜態(tài)數(shù)據(jù)區(qū)。在程序運(yùn)行期間,此區(qū)域中的數(shù)據(jù)一直占用這些存儲(chǔ)空間。
staticint只能賦初值嗎?
靜態(tài)變量是靜態(tài)的,因?yàn)樗牡刂吩诔绦虻恼麄€(gè)生命周期中都是靜態(tài)的。也就是說(shuō),整個(gè)程序只保留一個(gè)副本。static關(guān)鍵字允許它在不同的函數(shù)調(diào)用之間保持其值。如果靜態(tài)變量的值在被訪問(wèn)后發(fā)生變化,它將保留新值。如果再次訪問(wèn)該變量,它將保持最新的值classA{公共:私人:}inta::I=1//類(lèi)的靜態(tài)變量必須用這種方式初始化。類(lèi)成員函數(shù)的靜態(tài)變量只能在該函數(shù)中使用。
兩者都在程序的數(shù)據(jù)區(qū)和全局變量區(qū)生成。
類(lèi)中的static變量什么時(shí)候初始化?
如果我們不考慮父類(lèi),我們可以先進(jìn)行靜態(tài)初始化,然后進(jìn)行非靜態(tài)初始化。
靜態(tài)初始化包括靜態(tài)成員變量和靜態(tài)塊的初始化。實(shí)際上,靜態(tài)塊在編譯期間是集中的。
非靜態(tài)初始化包括非靜態(tài)成員變量初始化、非靜態(tài)塊和構(gòu)造方法,編譯后集中在構(gòu)造方法中。
如果沒(méi)有相互通話,那就非常簡(jiǎn)單了。首先,靜態(tài)初始化。如果在靜態(tài)初始化過(guò)程中調(diào)用了后者呢?!你可以編寫(xiě)一個(gè)代碼來(lái)測(cè)試它:
輸出:
你可以先看到它確實(shí)是靜態(tài)初始化,但是中間有對(duì)構(gòu)造方法的調(diào)用。
雖然編譯器不報(bào)告錯(cuò)誤,但此調(diào)用實(shí)際上是有風(fēng)險(xiǎn)的。
由于靜態(tài)成員變量(如果已設(shè)置)在初始化之前調(diào)用類(lèi)構(gòu)造函數(shù)(假設(shè)存在依賴(lài)關(guān)系),因此該過(guò)程實(shí)際上是不可控制的。
看看這個(gè)例子:你能想象這種輸出嗎?
因此,如果必須在靜態(tài)初始化過(guò)程中調(diào)用此類(lèi)的構(gòu)造函數(shù)。
一定要注意初始化順序,準(zhǔn)確到語(yǔ)句。