靜態(tài)代碼塊是在類(lèi)加載的過(guò)程中被執(zhí)行的一段代碼塊,它在類(lèi)的初始化階段被調(diào)用,而且只會(huì)被執(zhí)行一次。那么,什么時(shí)候會(huì)觸發(fā)類(lèi)的初始化呢?
1. 創(chuàng)建類(lèi)的實(shí)例:當(dāng)我們通過(guò)new關(guān)鍵字創(chuàng)建一個(gè)類(lèi)的實(shí)例時(shí),會(huì)觸發(fā)該類(lèi)的初始化過(guò)程。在實(shí)例化之前,會(huì)先執(zhí)行靜態(tài)代碼塊。
2. 調(diào)用類(lèi)的靜態(tài)成員:當(dāng)我們調(diào)用類(lèi)的靜態(tài)成員(靜態(tài)變量或靜態(tài)方法)時(shí),也會(huì)觸發(fā)類(lèi)的初始化。在第一次訪問(wèn)靜態(tài)成員之前,會(huì)先執(zhí)行靜態(tài)代碼塊。
3. 使用反射訪問(wèn)類(lèi):當(dāng)我們使用反射機(jī)制來(lái)訪問(wèn)一個(gè)類(lèi)時(shí),也會(huì)觸發(fā)類(lèi)的初始化。在創(chuàng)建反射對(duì)象之前,會(huì)先執(zhí)行靜態(tài)代碼塊。
需要注意的是,只有在類(lèi)第一次被加載時(shí)才會(huì)執(zhí)行靜態(tài)代碼塊。如果一個(gè)類(lèi)已經(jīng)被加載過(guò)了,再次加載同一個(gè)類(lèi)時(shí),靜態(tài)代碼塊不會(huì)再次執(zhí)行。
靜態(tài)代碼塊通常用來(lái)初始化類(lèi)的靜態(tài)成員變量,或執(zhí)行一些需要在類(lèi)加載時(shí)就完成的操作。它的執(zhí)行順序是按照代碼的順序來(lái)的,先執(zhí)行靜態(tài)代碼塊,然后才會(huì)執(zhí)行其他靜態(tài)成員的初始化。
總結(jié)一下,靜態(tài)代碼塊在類(lèi)加載時(shí)被執(zhí)行,觸發(fā)類(lèi)加載的條件包括創(chuàng)建類(lèi)的實(shí)例、調(diào)用類(lèi)的靜態(tài)成員和使用反射訪問(wèn)類(lèi)。靜態(tài)代碼塊通常用來(lái)初始化類(lèi)的靜態(tài)成員變量或執(zhí)行一些需要在類(lèi)加載時(shí)就完成的操作。