那一年,呼延十又回想起被載入順序支配的恐懼,筆試題上,好幾個類,幾個方法,幾個輸出語句,讓你按照順序寫出輸出.我真的是有一句…
但是呢,我們還是有了解一下的必要的,在編碼過程中有許多的應用.
經常用來比較順序的,無非就是靜態**塊,普通**塊,靜態方法和普通方法.
這裡直接說一下結論:
先靜態後普通最後構造方法,先父類後子類.
看一下實際的例子:
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.載入靜態成員 靜態 塊 只執行一次 先遞迴載入父類的靜態成員 靜態 塊,再依次載入到本類的靜態成功 靜態 塊。同乙個類內的靜態成員 靜態 塊,按寫的 先後順序載入 如果其間呼叫了靜態方法,則呼叫時會先執行該靜態方法,再繼續載入,同個類的靜 ...