1.加載
裝載類的第一個階段
取得類的二進(jìn)制流
轉(zhuǎn)為方法區(qū)數(shù)據(jù)結(jié)構(gòu)
在 Java 堆中生成對應(yīng)的 java.lang.Class 對象
2.鏈接
1)驗(yàn)證
保證 Class 流的格式是正確的
? 文件 格式的驗(yàn)證
是否以 0xCAFEBABE 開頭
版本號是否合理
? 元數(shù)據(jù)驗(yàn)證
是否有父類
繼承了 final 類?
非抽象類實(shí)現(xiàn)了所有的抽象方法
? 字節(jié) 碼驗(yàn)證 ( 很復(fù)雜 )
運(yùn)行檢查
棧數(shù)據(jù)類型和操作碼數(shù)據(jù)參數(shù)吻合
跳 轉(zhuǎn)指令指定到合理的位置
2)準(zhǔn)備
分配內(nèi)存帮毁,并為類設(shè)置初始值 (方法區(qū)中)
public static int v=1;
在準(zhǔn)備階段中实苞, v 會被設(shè)置為 0
在初始化的 < clinit > 中才會被設(shè)置為 1
對于 static final 類型,在準(zhǔn)備階段就會被賦上正確的值
public static final int v=1;
3)解析
符號引用替換為直接引用
3.初始化
執(zhí)行類構(gòu)造器<clinit>
static 變量 賦值語句
static{} 語句
子 類的 < clinit > 調(diào)用前保證父類的 < clinit > 被調(diào)用
< clinit > 是線程安全的