Javaamp;amp;(面试题)初始化顺序总结
生活随笔
收集整理的這篇文章主要介紹了
Javaamp;amp;(面试题)初始化顺序总结
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 ?無(wú)繼承情況下的Java初始化順序: class?Sample { ??????Sample(String s) ??????{ ????????????System.out.println(s); ??????} ??????Sample() ??????{ ????????????System.out.println("Sample默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} } class?Test{ ??????static?Sample?sam=new?Sample("靜態(tài)成員sam初始化"); ??????Sample?sam1=new?Sample("sam1成員初始化"); ??????static{ ????????????System.out.println("static塊運(yùn)行"); ????????????if(sam==null)System.out.println("sam is null"); ????????????sam=new?Sample("靜態(tài)塊內(nèi)初始化sam成員變量"); ????????????} ??????Test() ??????{ ????????????System.out.println("Test默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????}
} //主函數(shù) ?public?static?void? main(String? str[]) {
?? ? Test?a=new?Test();
?} 輸出結(jié)果為: 靜態(tài)成員sam初始化 ? ??-----靜態(tài)成員初始化 static塊運(yùn)行 ? ? ? ? ?-----靜態(tài)塊被運(yùn)行 靜態(tài)塊內(nèi)初始化sam成員變量?----靜態(tài)塊運(yùn)行 sam1成員初始化 ? ? ?-----普通成員初始化 Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?-----構(gòu)造函數(shù)運(yùn)行
由此能夠得出結(jié)論: a?靜態(tài)成員變量首先初始化(注意。Static能夠看做一個(gè)靜態(tài)成員。其運(yùn)行順序和其在類(lèi)中申明的順序有關(guān)) b 普通成員初始化 c 運(yùn)行構(gòu)造函數(shù)。
對(duì)于靜態(tài)成員(static塊能夠看成普通的一個(gè)靜態(tài)成員,其并不一定在類(lèi)初始化時(shí)首先運(yùn)行)和普通成員。其初始化順序僅僅與其在類(lèi)定義中的順序有關(guān),和其它因素?zé)o關(guān)。 比如以下的樣例:
class?Test{ ??????static{ ????????????System.out.println("static 塊 1? 運(yùn)行"); ????????????} ??????static?Sample?staticSam1=new?Sample("靜態(tài)成員staticSam1初始化"); ??????Sample?sam1=new?Sample("sam1成員初始化"); ??????static?Sample?staticSam2=new?Sample("靜態(tài)成員staticSam2初始化"); ??????static{ ????????????System.out.println("static 塊 2? 運(yùn)行"); ????????????} ??????Test() ??????{ ????????????System.out.println("Test默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam2=new?Sample("sam2成員初始化");
}
則結(jié)果為: static 塊 1? 運(yùn)行 靜態(tài)成員staticSam1初始化 靜態(tài)成員staticSam2初始化 static 塊 2? 運(yùn)行? ?? ? ? ? ? ? ? ? ? ? ?--------靜態(tài)成員 sam1成員初始化 sam2成員初始化 ?? ? ? ? ? ? ? ? ? ? ?--------普通成員 Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?? ? ? ? ? ? ? ? ? ? ?--------構(gòu)造函數(shù)
2 Java繼承情況下的初始化順序:
class?Test{ ??????static{ ????????????System.out.println("父類(lèi)static 塊 1? 運(yùn)行"); ????????????} ??????static?Sample?staticSam1=new?Sample("父類(lèi) 靜態(tài)成員staticSam1初始化"); ??????Sample?sam1=new?Sample("父類(lèi) sam1成員初始化"); ??????static?Sample?staticSam2=new?Sample("父類(lèi) 靜態(tài)成員staticSam2初始化"); ??????static{ ????????????System.out.println("父類(lèi) static 塊 2? 運(yùn)行"); ????????????} ??????Test() ??????{ ????????????System.out.println("父類(lèi) Test默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam2=new?Sample("父類(lèi) sam2成員初始化");
}
class?TestSub?extends?Test { ??????static?Sample?staticSamSub=new?Sample("子類(lèi) 靜態(tài)成員staticSamSub初始化"); ??????TestSub() ??????{ ????????????System.out.println("子類(lèi) TestSub 默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam1=new?Sample("子類(lèi) sam1成員初始化"); ??????static?Sample?staticSamSub1=new?Sample("子類(lèi) 靜態(tài)成員staticSamSub1初始化"); ?????? ??????static{System.out.println("子類(lèi) static 塊? 運(yùn)行");} ??????Sample?sam2=new?Sample("子類(lèi) sam2成員初始化"); }
運(yùn)行結(jié)果: 父類(lèi) static 塊 1? 運(yùn)行 父類(lèi) 靜態(tài)成員staticSam1初始化 父類(lèi) 靜態(tài)成員staticSam2初始化 父類(lèi) static 塊 2? 運(yùn)行 ?? ? ? ? ? ? ? ? ? ? ? ?--------父類(lèi)靜態(tài)成員初始化 子類(lèi) 靜態(tài)成員staticSamSub初始化 子類(lèi) 靜態(tài)成員staticSamSub1初始化 子類(lèi) static 塊? 運(yùn)行 ?? ? ? ? ? ? ? ? ? ? ? ?-------子類(lèi)靜態(tài)成員初始化 父類(lèi) sam1成員初始化 父類(lèi) sam2成員初始化 父類(lèi) Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ? ? ?? ?? ? ? ? ? ? ? ? ? ? ? ?-------父類(lèi)普通成員初始化和構(gòu)造函數(shù)運(yùn)行 子類(lèi) sam1成員初始化 子類(lèi) sam2成員初始化 子類(lèi) TestSub 默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?? ? ? ? ? ? ? ? ? ? ? ?-------子類(lèi)普通成員初始化和構(gòu)造函數(shù)運(yùn)行
由此得出Java初始化順序結(jié)論: 1 繼承體系的全部靜態(tài)成員初始化(先父類(lèi),后子類(lèi)) 2 父類(lèi)初始化完畢(普通成員的初始化-->構(gòu)造函數(shù)的調(diào)用) 3 子類(lèi)初始化(普通成員-->構(gòu)造函數(shù))
Java初始化順序如圖:
} //主函數(shù) ?public?static?void? main(String? str[]) {
?? ? Test?a=new?Test();
?} 輸出結(jié)果為: 靜態(tài)成員sam初始化 ? ??-----靜態(tài)成員初始化 static塊運(yùn)行 ? ? ? ? ?-----靜態(tài)塊被運(yùn)行 靜態(tài)塊內(nèi)初始化sam成員變量?----靜態(tài)塊運(yùn)行 sam1成員初始化 ? ? ?-----普通成員初始化 Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?-----構(gòu)造函數(shù)運(yùn)行
由此能夠得出結(jié)論: a?靜態(tài)成員變量首先初始化(注意。Static能夠看做一個(gè)靜態(tài)成員。其運(yùn)行順序和其在類(lèi)中申明的順序有關(guān)) b 普通成員初始化 c 運(yùn)行構(gòu)造函數(shù)。
對(duì)于靜態(tài)成員(static塊能夠看成普通的一個(gè)靜態(tài)成員,其并不一定在類(lèi)初始化時(shí)首先運(yùn)行)和普通成員。其初始化順序僅僅與其在類(lèi)定義中的順序有關(guān),和其它因素?zé)o關(guān)。 比如以下的樣例:
class?Test{ ??????static{ ????????????System.out.println("static 塊 1? 運(yùn)行"); ????????????} ??????static?Sample?staticSam1=new?Sample("靜態(tài)成員staticSam1初始化"); ??????Sample?sam1=new?Sample("sam1成員初始化"); ??????static?Sample?staticSam2=new?Sample("靜態(tài)成員staticSam2初始化"); ??????static{ ????????????System.out.println("static 塊 2? 運(yùn)行"); ????????????} ??????Test() ??????{ ????????????System.out.println("Test默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam2=new?Sample("sam2成員初始化");
}
則結(jié)果為: static 塊 1? 運(yùn)行 靜態(tài)成員staticSam1初始化 靜態(tài)成員staticSam2初始化 static 塊 2? 運(yùn)行? ?? ? ? ? ? ? ? ? ? ? ?--------靜態(tài)成員 sam1成員初始化 sam2成員初始化 ?? ? ? ? ? ? ? ? ? ? ?--------普通成員 Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?? ? ? ? ? ? ? ? ? ? ?--------構(gòu)造函數(shù)
2 Java繼承情況下的初始化順序:
class?Test{ ??????static{ ????????????System.out.println("父類(lèi)static 塊 1? 運(yùn)行"); ????????????} ??????static?Sample?staticSam1=new?Sample("父類(lèi) 靜態(tài)成員staticSam1初始化"); ??????Sample?sam1=new?Sample("父類(lèi) sam1成員初始化"); ??????static?Sample?staticSam2=new?Sample("父類(lèi) 靜態(tài)成員staticSam2初始化"); ??????static{ ????????????System.out.println("父類(lèi) static 塊 2? 運(yùn)行"); ????????????} ??????Test() ??????{ ????????????System.out.println("父類(lèi) Test默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam2=new?Sample("父類(lèi) sam2成員初始化");
}
class?TestSub?extends?Test { ??????static?Sample?staticSamSub=new?Sample("子類(lèi) 靜態(tài)成員staticSamSub初始化"); ??????TestSub() ??????{ ????????????System.out.println("子類(lèi) TestSub 默認(rèn)構(gòu)造函數(shù)被調(diào)用"); ??????} ??????Sample?sam1=new?Sample("子類(lèi) sam1成員初始化"); ??????static?Sample?staticSamSub1=new?Sample("子類(lèi) 靜態(tài)成員staticSamSub1初始化"); ?????? ??????static{System.out.println("子類(lèi) static 塊? 運(yùn)行");} ??????Sample?sam2=new?Sample("子類(lèi) sam2成員初始化"); }
運(yùn)行結(jié)果: 父類(lèi) static 塊 1? 運(yùn)行 父類(lèi) 靜態(tài)成員staticSam1初始化 父類(lèi) 靜態(tài)成員staticSam2初始化 父類(lèi) static 塊 2? 運(yùn)行 ?? ? ? ? ? ? ? ? ? ? ? ?--------父類(lèi)靜態(tài)成員初始化 子類(lèi) 靜態(tài)成員staticSamSub初始化 子類(lèi) 靜態(tài)成員staticSamSub1初始化 子類(lèi) static 塊? 運(yùn)行 ?? ? ? ? ? ? ? ? ? ? ? ?-------子類(lèi)靜態(tài)成員初始化 父類(lèi) sam1成員初始化 父類(lèi) sam2成員初始化 父類(lèi) Test默認(rèn)構(gòu)造函數(shù)被調(diào)用 ? ? ?? ?? ? ? ? ? ? ? ? ? ? ? ?-------父類(lèi)普通成員初始化和構(gòu)造函數(shù)運(yùn)行 子類(lèi) sam1成員初始化 子類(lèi) sam2成員初始化 子類(lèi) TestSub 默認(rèn)構(gòu)造函數(shù)被調(diào)用 ?? ? ? ? ? ? ? ? ? ? ? ?-------子類(lèi)普通成員初始化和構(gòu)造函數(shù)運(yùn)行
由此得出Java初始化順序結(jié)論: 1 繼承體系的全部靜態(tài)成員初始化(先父類(lèi),后子類(lèi)) 2 父類(lèi)初始化完畢(普通成員的初始化-->構(gòu)造函數(shù)的調(diào)用) 3 子類(lèi)初始化(普通成員-->構(gòu)造函數(shù))
Java初始化順序如圖:
總結(jié)
以上是生活随笔為你收集整理的Javaamp;amp;(面试题)初始化顺序总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《算法导论》读书笔记(七)
- 下一篇: 树 - 定义和基本概念