Java代碼執(zhí)行順序——類的初始化場景
示例分析
例一
public class Solution { //public static Solution s1=new Solution(); public Solution(){ System.out.println("構(gòu)造方法"); } { System.out.println("普通代碼塊:blockA"); } static{ System.out.println("靜態(tài)代碼塊:blockB"); } public static void main(String[] args) { System.out.println("hello"); //Solution s2=new Solution(); } }
結(jié)果:
靜態(tài)代碼塊:blockB
hello
分析
? 由于main函數(shù)是一個靜態(tài)方法,在調(diào)用這個靜態(tài)方法時,會對類Solution進行初始化,而類初始化階段,會對靜態(tài)變量和靜態(tài)代碼塊按照順序執(zhí)行,所以此處會先執(zhí)行靜態(tài)代碼塊的內(nèi)容,然后輸出”helllo“。
例二
public class Solution { public static Solution s1=new Solution(); public Solution(){ System.out.println("構(gòu)造方法"); } { System.out.println("普通代碼塊:blockA"); } static{ System.out.println("靜態(tài)代碼塊:blockB"); } public static void main(String[] args) { System.out.println("hello"); //Solution s2=new Solution(); } }
結(jié)果:
普通代碼塊:blockA
構(gòu)造方法
靜態(tài)代碼塊:blockB
hello
分析
- 在調(diào)用main靜態(tài)方法時,會對類Solution進行初始化。
- 在類Solution內(nèi)部,靜態(tài)變量s1需要new一個Solution對象,所以執(zhí)行了相關(guān)的非靜態(tài)的代碼,其中,普通代碼塊的執(zhí)行優(yōu)先于構(gòu)造方法。
- 在此之后執(zhí)行靜態(tài)代碼塊的代碼,最后輸出"hello"。
例三
public class Solution { public static Solution s1=new Solution(); public Solution(){ System.out.println("構(gòu)造方法"); } { System.out.println("普通代碼塊:blockA"); } static{ System.out.println("靜態(tài)代碼塊:blockB"); } public static void main(String[] args) { System.out.println("hello"); Solution s2=new Solution(); } }
結(jié)果:
普通代碼塊:blockA
構(gòu)造方法
靜態(tài)代碼塊:blockB
hello
普通代碼塊:blockA
構(gòu)造方法
分析:
- 在例二的基礎(chǔ)上,又有Solution類的對象s2,new一個類對象的應該按照靜態(tài)變量——靜態(tài)代碼塊——普通代碼塊——構(gòu)造方法的順序執(zhí)行。但是,由于靜態(tài)變量和靜態(tài)代碼塊在前面已經(jīng)初始化過了,所以此處不用再做,僅僅執(zhí)行普通代碼塊和構(gòu)造方法。
普通new一個對象的步驟
public class Solution { //public static Solution s1=new Solution(); public Solution(){ System.out.println("構(gòu)造方法"); } { System.out.println("普通代碼塊:blockA"); } static{ System.out.println("靜態(tài)代碼塊:blockB"); } public static void main(String[] args) { //System.out.println("hello"); Solution s2=new Solution(); } }
結(jié)果:
靜態(tài)代碼塊:blockB
普通代碼塊:blockA
構(gòu)造方法
分析:
- 按照靜態(tài)變量——靜態(tài)代碼塊——普通代碼塊——構(gòu)造方法的順序執(zhí)行。
包含父類的情況
父類
class FatherClass { // 靜態(tài)變量 public static String parent_StaticField = "父----靜態(tài)變量"; // 變量 public String parent_Field = "父類----普通變量"; // 靜態(tài)初始化塊 static { System.out.println(parent_StaticField); System.out.println("父類------靜態(tài)初始化塊"); } // 初始化塊 { System.out.println(parent_Field); System.out.println("父類-----初始化塊"); } // 構(gòu)造器 public FatherClass() { System.out.println("父類--構(gòu)造器"); } }
子類
public class SubSon extends FatherClass { // 靜態(tài)變量 public static String son_StaticField = "子類--靜態(tài)變量"; // 變量 public String son_Field = "子類--變量"; // 靜態(tài)初始化塊 static { System.out.println(son_StaticField); System.out.println("子類--靜態(tài)初始化塊"); } // 初始化塊 { System.out.println(son_Field); System.out.println("子類--初始化塊"); } // 構(gòu)造器 public SubSon(){ System.out.println( "子類--構(gòu)造器" ); } public static void main(String[] args) { System.out.println("子類-----main方法"); new SubSon(); } }
結(jié)果:
父----靜態(tài)變量
父類------靜態(tài)初始化塊
子類--靜態(tài)變量
子類--靜態(tài)初始化塊
子類-----main方法
父類----普通變量
父類-----初始化塊
父類--構(gòu)造器
子類--變量
子類--初始化塊
子類--構(gòu)造器
結(jié)合一張圖(圖源見水?。?/p>
以上就是Java代碼執(zhí)行順序——類的初始化場景的詳細內(nèi)容,更多關(guān)于Java執(zhí)行順序類初始化場景的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud-Alibaba-Sentinel服務降級,熱點限流,服務熔斷
這篇文章主要介紹了SpringCloud-Alibaba-Sentinel服務降級,熱點限流,服務熔斷,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12SpringBoot下使用MyBatis-Puls代碼生成器的方法
這篇文章主要介紹了SpringBoot下使用MyBatis-Puls代碼生成器的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select解析
這篇文章主要介紹了mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03