
今天在專案中看到這行代碼,靜態代碼塊,很久沒用靜態代碼塊了,今天來復習一下,
依舊按照為什么?是什么?怎么用?的思想,去學習,
【為什么?】
先說說代碼中為什么要使用這種寫法吧,
還記得靜態代碼塊的特點嗎?隨著類的加載而執行,而且只執行一次
對,沒錯,就是這個,上面的代碼就是因為這個特點而這樣寫的,可以使得靜態代碼塊中的代碼只執行一次,不需要每次呼叫這個變數都給它賦值,
【是什么?】
靜態代碼塊:執行優先級高于非靜態的初始化塊,它會在類初始化的時候執行一次,執行完成便銷毀,它僅能初始化類變數,即static修飾的資料成員,
靜態代碼塊寫法,
static{
}
對應的擴展下非靜態代碼塊
非靜態代碼塊:
執行的時候如果有靜態初始化塊,先執行靜態初始化塊再執行非靜態初始化塊,在每個物件生成時都會被執行一次,它可以初始化類的實體變數,非靜態初始化塊會在建構式執行時,在建構式主體代碼執行之前被運行,
寫法:
{
}
【怎么用?】
在類中定義一個靜態代碼塊就行了,然后在里面寫對應的代碼即可

【擴展】
一說到靜態代碼塊,順便擴展下相應的知識,在面試中可能會被面試官問到,
靜態代碼塊的執行順序:靜態代碼塊----->非靜態代碼塊-------->建構式
但是面試中,面試官可能會連著其他知識點一起問,比如說繼承,這邊我就寫個小列子,
父類:

子類:

在子類中執行main方法,可以看到控制臺列印出來的結果

如果你想看靜態代碼塊的特征,隨著類的加載而執行,而且只執行一次,就在父類中new一個子類就可以看出來了,

執行父類中的main方法,控制臺列印

然后跟上面的在子類中new一個sons類的結果進行對比,左圖是父類執行main方法,右圖是子類執行main方法,
可以看出來,原本在子類中執行main方法,由于子類繼承父類,所以父類中的靜態代碼塊優先執行一次,
但是在左圖中,是在父類中執行了main方法,本身父類執行main方法就會執行一次靜態代碼塊,但是在父類中main方法new了一次子類,按繼承關系,父類中的靜態代碼塊應該還會執行,但是控制臺中卻沒有列印,這就是因為靜態代碼塊的特征的原因所致,隨著類的加載而執行,而且只執行一次,
如果還是不理解,以下代碼更為直觀

參考 : https://blog.csdn.net/qq_35868412/article/details/89360250
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/175975.html
標籤:Java
