程式碼塊相關的題,特麼再也不會做錯了!
程式碼塊包括靜態程式碼塊和非靜態程式碼塊,另外還有建構函式,它們的執行順序是面試中經常考的,理解了下面這些基本知識,特麼再也不會做錯了。
一、靜態程式碼塊
定義
一個類的原始檔(.java)被編譯為位元組碼檔案(.class)後,當需要使用某個類時,Java 虛擬機器就將該類的位元組碼檔案讀入記憶體,載入類中的資訊,靜態程式碼塊只被執行一次,且靜態程式碼塊不能被訪問修飾符(private、default、protected、public)修飾。靜態程式碼塊是初始化該類的,而建構函式才是初始化該類具體的物件例項的。
// 靜態程式碼塊 static { ... }
靜態程式碼塊執行的時機
1、顯式使用 Class.forName() 載入某個類時。
2、執行一個類的 main() 方法時。
3、使用建構函式建立(new)一個物件時,如 Test test = new Test(),等同於 Test test = Class.forName().newInstance()。
4、呼叫類的靜態變數(static)時,注意呼叫靜態常量(final static 關鍵字修飾)是不會執行靜態程式碼塊的。
5、呼叫類的靜態函式時,無論是否有 final 關鍵字修飾,都會執行靜態程式碼塊。
注意:
1、多個靜態程式碼塊按定義的順序從前往後依次執行。
2、使用 Class.forName() 時不初始化該類不會執行靜態程式碼塊,如 Class.forName("Test", false, Test.class.getClassLoader())。
靜態程式碼塊的作用
靜態程式碼塊具有初始化靜態成員變數和給靜態成員變數賦值的作用,如單例模式中的餓漢模式,類一旦載入就例項化出一個物件,用到的就是靜態程式碼塊。
二、非靜態程式碼塊
定義
非靜態程式碼塊又稱為初始化塊,直接用 {} 定義,可以用在類中和方法中。
// 非靜態程式碼塊 { ... }
非靜態程式碼塊執行的時機
靜態程式碼塊執行之後,建構函式執行之前,每一次建立物件時執行。
注意:多個非靜態程式碼塊按定義的順序從前往後依次執行。
非靜態程式碼塊的作用
非靜態程式碼塊也有初始化變數和物件的作用,但這個初始化有些雞肋,因為我們都是在建構函式中初始化物件的。
三、總結
一個類中,按照如下順序執行:
1、執行靜態程式碼塊
2、執行非靜態程式碼塊
3、執行建構函式
對於靜態變數、靜態程式碼塊、變數、非靜態程式碼塊、建構函式,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、非靜態程式碼塊)> 建構函式。
在多個類的繼承中,按照如下順序執行:
1、執行父類的靜態程式碼塊,初始化父類靜態變數。
2、執行子類的靜態程式碼塊,初始化子類靜態變數。
3、執行父類的非靜態程式碼塊和父類的建構函式,初始化父類的成員變數。
3、執行子類的非靜態程式碼塊和字類的建構函式,初始化子類的成員變數。

初始化過程
想看更多程式設計文章,歡迎關注下方的微信公眾號哦。

程式設計心路