靜態(tài)代碼塊纬乍、構(gòu)造器碱茁、非靜態(tài)代碼塊的執(zhí)行順序
執(zhí)行代碼:
public class LeafTest {
public static void main(String[] args) {
Leaf leaf1 = new Leaf();
System.out.println("****************************");
Leaf leaf2 = new Leaf();
}
}
class Root{
static {
System.out.println("Root靜態(tài)代碼塊");
}
{
System.out.println("Root非靜態(tài)代碼塊");
}
public Root() {
System.out.println("Root構(gòu)造器");
}
}
class Mid extends Root{
static {
System.out.println("Mid靜態(tài)代碼塊");
}
{
System.out.println("Mid非靜態(tài)代碼塊");
}
public Mid() {
System.out.println("Mid構(gòu)造器");
}
}
class Leaf extends Mid{
static {
System.out.println("Leaf靜態(tài)代碼塊");
}
{
System.out.println("Leaf非靜態(tài)代碼塊");
}
public Leaf() {
System.out.println("Leaf構(gòu)造器");
}
}
執(zhí)行結(jié)果:
Root靜態(tài)代碼塊
Mid靜態(tài)代碼塊
Leaf靜態(tài)代碼塊
Root非靜態(tài)代碼塊
Root構(gòu)造器
Mid非靜態(tài)代碼塊
Mid構(gòu)造器
Leaf非靜態(tài)代碼塊
Leaf構(gòu)造器
****************************
Root非靜態(tài)代碼塊
Root構(gòu)造器
Mid非靜態(tài)代碼塊
Mid構(gòu)造器
Leaf非靜態(tài)代碼塊
Leaf構(gòu)造器
說明:
- 在
new
一個(gè)對(duì)象之前,需要先將類加載到內(nèi)存中仿贬,所以會(huì)一直找到最頂層父類Object加載纽竣,依次往下加載父類,由于靜態(tài)代碼塊是隨著類的加載而執(zhí)行的茧泪,所以會(huì)先輸出“XXX靜態(tài)代碼塊”退个; - 加載完之后,由于非靜態(tài)代碼的執(zhí)行順序是高于構(gòu)造器方法體內(nèi)容的调炬,所以语盈,先執(zhí)行“XXX非靜態(tài)方法塊”后執(zhí)行“XXX構(gòu)造器”;
- 在
new
一個(gè)對(duì)象時(shí)缰泡,因?yàn)橐呀?jīng)加載過了刀荒,所以只執(zhí)行非靜態(tài)代碼塊和構(gòu)造器內(nèi)容。