java類中元素初始化順序詳解
public class Test4 {
@Test
public void test(){
child child = new child();
}
}
class parent{
public static String parentStaticField = "父類靜態(tài)變量";
public String parentNormalField ="父類普通變量";
static {
System.out.println(parentStaticField);
System.out.println("父類靜態(tài)塊");
}
{
System.out.println(parentNormalField);
System.out.println("父類普通塊");
}
public parent(){
System.out.println("父類構(gòu)造方法");
}
}
class child extends parent{
public static String childStaticField = "子類靜態(tài)變量";
public String childNormalField ="子類普通變量";
static {
System.out.println(childStaticField);
System.out.println("子類靜態(tài)塊");
}
{
System.out.println(childNormalField);
System.out.println("子類普通塊");
}
public child(){
System.out.println("子類構(gòu)造方法");
}
}
輸出:
父類靜態(tài)變量
父類靜態(tài)塊
子類靜態(tài)變量
子類靜態(tài)塊
父類普通變量
父類普通塊
父類構(gòu)造方法
子類普通變量
子類普通塊
子類構(gòu)造方法
執(zhí)行過程:
1、當(dāng)執(zhí)行到new child時(shí),裝載器尋找已經(jīng)編譯的child類的代碼(也就是child.class文件)。在裝載的過程中,裝載器注意到它有一個(gè)基類,于是它再裝載基類。不管你創(chuàng)不創(chuàng)建基類對象,這個(gè)過程總會(huì)發(fā)生。如果基類還有基類,那么第二個(gè)基類也會(huì)被裝載,依此類推。
2、執(zhí)行根基類的static初始化,然后是下一個(gè)派生類的static初始化,依此類推。這個(gè)順序非常重要,因?yàn)榕缮惖摹皊tatic初始化”有可能要依賴基類成員的正確初始化。
3、當(dāng)所有必要的類都已經(jīng)裝載結(jié)束,創(chuàng)建child類對象。
4、child類存在父類,則調(diào)用父類的構(gòu)造函數(shù),可以使用super來指定調(diào)用哪個(gè)構(gòu)造函數(shù)。
基類的構(gòu)造過程以及構(gòu)造順序,同派生類的相同。首先基類中各個(gè)變量按照字面順序進(jìn)行初始化,然后執(zhí)行基類的構(gòu)造函數(shù)的其余部分。
5、對子類成員數(shù)據(jù)按照它們聲明的順序初始化,執(zhí)行子類構(gòu)造函數(shù)的其余部分。
相關(guān)文章
SpringBoot項(xiàng)目集成Flyway詳細(xì)過程
今天帶大家學(xué)習(xí)SpringBoot項(xiàng)目集成Flyway詳細(xì)過程,文中有非常詳細(xì)的介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能
這篇文章主要介紹了Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08解決StringBuffer和StringBuilder的擴(kuò)容問題
這篇文章主要介紹了解決StringBuffer和StringBuilder的擴(kuò)容問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07RestTemplate如何使用JSON發(fā)送Post請求
這篇文章主要介紹了RestTemplate如何使用JSON發(fā)送Post請求問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09