天天看點

Java代碼執行順序

在運作一個Java程式時,分為類加載過程和執行個體化過程,即static修飾的代碼塊、屬性、聲明為類加載,類的普通屬性、代碼塊、構造器為執行個體化過程。其中類加載的代碼屬于整個類,隻執行一次;而執行個體化過程中的代碼屬于執行個體化對象的,每次執行個體化過程都執行。

執行順序類加載先于執行個體化執行,執行過程自上而下按順序執行。如果父類有類加載代碼,先按前面的規則執行父類的類加載代碼,執行完後再執行自己的類加載代碼。如果類加載過程中執行個體化了對象,則暫停類加載過程,執行執行個體化代碼,執行個體化完成後繼續執行未執行完的類加載代碼。

當類加載代碼執行完後,執行執行個體化代碼,執行個體化過程中不能執行類加載過程。執行個體化變量先自上而下按順序執行普通代碼塊、屬性,最後執行構造器,如果有父類就先按前面的規則執行父類的。

當執行完類加載和執行個體化代碼後,再去執行main方法裡的内容。

以下為驗證代碼:`

public class MyTest extends Test{
    public static int x = count("靜态");
    static {
        System.out.println("靜态代碼塊1");
    }
    public static MyTest test1 = new MyTest("test1");
    public static MyTest test2 = new MyTest("test2");
    public static int n = count("非靜态");
    public int a = count("");
    {
        System.out.println("普通代碼塊1");
    }
    static {
        System.out.println("靜态代碼塊2");
    }
    public static int count(String string){
        System.out.println("指派"+string+"變量");
        return ;
    }
    public MyTest(String string){
        System.out.println("構造器執行個體化"+string);
    }
    {
        System.out.println("普通代碼塊2");
    }
    public static void main(String[] args) {
        MyTest test3 = new MyTest("Mian");
    }
}
class Test {
    {
        System.out.println("父類普通代碼塊");
    }
}
           

運作結果

Java代碼執行順序