Java類載入的執行順序

2021-09-10 08:10:55 字數 1678 閱讀 4969

那一年,呼延十又回想起被載入順序支配的恐懼,筆試題上,好幾個類,幾個方法,幾個輸出語句,讓你按照順序寫出輸出.我真的是有一句…

但是呢,我們還是有了解一下的必要的,在編碼過程中有許多的應用.

經常用來比較順序的,無非就是靜態**塊,普通**塊,靜態方法和普通方法.

這裡直接說一下結論:

先靜態後普通最後構造方法,先父類後子類.

看一下實際的例子:

package daily;

/** * created by huyanshi on 2019/1/28

*/public

class

classloadorder

}class

apublic

intafunc()

publica(

)}class

bextends

astatic

private

int i =

bfunc()

;private

static

intstaticfunc()

public

intbfunc()

}

他的輸出是什麼呢?

a-----static

b----- static func

b----- static

a----- default

a----- constructor

b----- default

b----- constructor

我們來跟隨順序一步一步來一下:

首先在main方法中,呼叫了b類的構造方法.

由於b類有父類,因此先載入a類.

載入a類的靜態**塊,輸出a-----static.

載入b類的靜態變數,呼叫了方法,輸出b----- static func.

載入b類的靜態**塊,輸出b----- static.

載入a類的普通變數,private int i = afunc();由於呼叫了方法,因此輸出a----- default.

載入a類的構造方法,輸出a----- constructor.

載入b類的普通變數,呼叫了方法,輸出b----- default.

載入b類的構造方法,輸出了b----- constructor.

這些其實是一些記憶內容啦.

在這期間,發現一些小的知識點,也記錄一下.

靜態變數,靜態**塊的載入順序只和**編寫的順序有關.

普通變數及構造方法,順序一定是先普通變數,再構造方法的.

其實我目前對這個知識點應用最多的就是靜態**塊.

經常在編碼過程中需要給常量的list,map賦值,這個時候我們希望程式啟動賦值一次即可,而程式中的其他方法可能就需要使用這些常量了,因此一般使用定義常量map,並在靜態**塊中給其賦值.這樣可以保證後續的使用不會拿到空的map,也保證了只載入這些預設值一次.

完.changelog 2019-01-28

更多學習筆記見個人部落格------>呼延十

Java類載入執行順序

簡要記錄類的載入執行順序 先說結論 父類靜態 塊 變數 子類靜態 塊 變數 父類普通 變數 塊 父類構造器 子類普通 變數 塊 子類構造器 具體執行過程 程式先找到main函式,不管此時有沒有使用new進行建立物件,都會將涉及到的類 例如父類 進行類載入 發現son類有乙個父類father類 初始化...

java中類的載入,及執行順序

類載入的順序 1 載入靜態成員 塊 靜態變數 靜態塊按書寫先後順序執行 先遞迴地載入父類的靜態成員 塊 object 的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入。如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的...

java中類的載入和執行順序

類載入的原則 延遲載入,能不載入就不載入。類載入的順序 1.載入靜態成員 靜態 塊 只執行一次 先遞迴載入父類的靜態成員 靜態 塊,再依次載入到本類的靜態成功 靜態 塊。同乙個類內的靜態成員 靜態 塊,按寫的 先後順序載入 如果其間呼叫了靜態方法,則呼叫時會先執行該靜態方法,再繼續載入,同個類的靜 ...