1. 程式人生 > >簡析靜態代碼塊,構造代碼塊(普通代碼塊),局部代碼塊,構造函數的執行順序

簡析靜態代碼塊,構造代碼塊(普通代碼塊),局部代碼塊,構造函數的執行順序

條件 簡析 tar nbsp info 代碼塊 itl 創建過程 targe

測試代碼:

package test;

public class Father {
    
    static{
        System.out.println("父類靜態代碼塊");
    }
    
    {
        System.out.println("父類構造代碼塊");
    }
    
    public Father(){
        System.out.println("父類構造函數");
    }
    
    public void is(){
        System.out.println(
"父類函數"); { System.out.println("父類局部代碼塊"); } } public static void main(String[] args) { System.out.println("這是main函數"); Father son = new Son(); son.is(); } } class Son extends Father{ static{ System.out.println(
"子類靜態代碼塊"); } { System.out.println("子類構造代碼塊"); } public Son(){ System.out.println("子類構造函數"); } public void is(){ System.out.println("子類函數"); { System.out.println("子類局部代碼塊"); } } }

執行順序:

技術分享圖片

1 Run as java application , 選擇父類, 執行順序:

技術分享圖片

2 Run as application , 選擇子類, 執行順序:

技術分享圖片

3 當子類函數和函數的局部代碼塊上下順序調換時,執行結果:

技術分享圖片

4 修改代碼,置main函數於子類中,再次測試:

技術分享圖片

綜上,總結如下:

1 同一個class中,構造代碼塊優先於主函數執行。

2 父類和子類存在時,JVM優先初始化父類,優先執行父類的靜態代碼塊。

3 當選擇執行父類時, 盡管在同一個Java文件中,父類的main函數優先於子類的靜態構造代碼塊執行,說明類的初始化實例化和靜態代碼塊的加載是有條件有順序的,參考:

https://blog.csdn.net/justloveyou_/article/details/72466416 , https://www.cnblogs.com/jpfss/p/9789953.html

4 局部代碼塊與函數方法,按照由上往下的執行順序執行

5 執行順序:

總的來說:父類靜態代碼塊>main函數(處於父類)>子類靜態代碼塊>main函數(處於子類)>父類構造代碼塊>父類構造函數>子類構造代碼塊>子類構造函數>子類局部代碼塊

一般來說: 靜態代碼塊>main函數>構造代碼塊>構造函數>局部代碼塊

簡析靜態代碼塊,構造代碼塊(普通代碼塊),局部代碼塊,構造函數的執行順序