淺談Java中父類與子類的加載順序詳解
更新時(shí)間:2013年06月04日 16:32:27 作者:
本篇文章是對(duì)Java中父類與子類的加載順序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
復(fù)制代碼 代碼如下:
class Parent {
// 靜態(tài)變量
public static String p_StaticField = "父類--靜態(tài)變量";
// 變量(其實(shí)這用對(duì)象更好能體同這一點(diǎn),如專門寫一個(gè)類的實(shí)例)
//如果這個(gè)變量放在初始化塊的后面,是會(huì)報(bào)錯(cuò)的,因?yàn)槟愀緵]有被初始化
public String p_Field = "父類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(p_StaticField);
System.out.println("父類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(p_Field);
System.out.println("父類--初始化塊");
}
// 構(gòu)造器
public Parent() {
System.out.println("父類--構(gòu)造器");
}
}
public class SubClass extends Parent {
// 靜態(tài)變量
public static String s_StaticField = "子類--靜態(tài)變量";
// 變量
public String s_Field = "子類--變量";
// 靜態(tài)初始化塊
static {
System.out.println(s_StaticField);
System.out.println("子類--靜態(tài)初始化塊");
}
// 初始化塊
{
System.out.println(s_Field);
System.out.println("子類--初始化塊");
}
// 構(gòu)造器
public SubClass() {
//super();
System.out.println("子類--構(gòu)造器");
}
// 程序入口
public static void main(String[] args) {
System.out.println("*************in main***************");
new SubClass();
System.out.println("*************second subClass***************");
new SubClass();
}
}
輸出結(jié)果
父類--靜態(tài)變量
父類--靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
*************in main***************
父類--變量
父類--初始化塊
父類--構(gòu)造器
子類--變量
子類--初始化塊
子類--構(gòu)造器
*************second subClass***************
父類--變量
父類--初始化塊
父類--構(gòu)造器
子類--變量
子類--初始化塊
子類--構(gòu)造器
結(jié)果分析:
很顯然在加載main方法后,靜態(tài)變量不管父類還是子類的都執(zhí)行了,然后才是父類和子類的的普通變量和構(gòu)造器。這是因?yàn)?,?dāng)要?jiǎng)?chuàng)建子類這個(gè)對(duì)象時(shí),發(fā)現(xiàn)這個(gè)類需要一個(gè)父類,所以把父類的.class加載進(jìn)來,然后依次初始化其普通變量和初始化代碼塊,最后其構(gòu)造器,然后可以開始子類的工作,把子類的.class加載進(jìn)來,在做子類的工作。
另外在Java中子類中都會(huì)有默認(rèn)的調(diào)用父類的默認(rèn)構(gòu)造函數(shù)即super(),當(dāng)僅僅有默認(rèn)構(gòu)造函數(shù)里
Java替你做了,我們可以做個(gè)實(shí)驗(yàn),如果在父類中注釋掉默認(rèn)構(gòu)造函數(shù),加一個(gè)有參的構(gòu)造函數(shù)時(shí),如果
子類中不加super(argument),此時(shí)會(huì)報(bào)語法錯(cuò)誤
如果我們把Main方法中的內(nèi)容全注釋掉,你會(huì)發(fā)現(xiàn)只會(huì)輸出
父類--靜態(tài)變量
父類--靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
其它不會(huì)輸出了。原因呢? 還要研究
相關(guān)文章
Java 內(nèi)存模型中的happen-before關(guān)系詳解
這篇文章主要為大家介紹了Java 內(nèi)存模型中的happen-before關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
第一次使用Android Studio時(shí)你應(yīng)該知道的一切配置(推薦)
這篇文章主要介紹了第一次使用Android Studio時(shí)你應(yīng)該知道的一切配置(推薦) ,需要的朋友可以參考下2017-09-09
Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)約瑟夫環(huán)算法,簡(jiǎn)單描述了約瑟夫環(huán)問題,并結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)約瑟夫環(huán)的具體操作技巧,需要的朋友可以參考下2017-09-09
Activiti如何動(dòng)態(tài)獲取流程圖過程詳解
這篇文章主要介紹了Activiti如何動(dòng)態(tài)獲取流程圖過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式
這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

