1. 程式人生 > >優先順序PK:Java中的4種程式碼塊,誰先誰後?

優先順序PK:Java中的4種程式碼塊,誰先誰後?

問題:Java裡的四種程式碼塊,像積木一般搭成程式碼塔。那麼一段複雜的程式碼在JVM裡每一句的執行順序是如何的呢?

思路:看程式碼塊的優先順序順序——>被呼叫的順序

答:要回答這個問題,我們先來看看四種程式碼塊是哪些:
1-1 Java程式碼塊定義

有了定義,還是要具體例子的:

public class HelloWrold {
    public static void main(String[] args) {
        new Person().function1();
        new Person().function1();
        System.out.println("6.=================");
        Person.function2();
        Person.function2();
    }
}
class Person {
    static{
        System.out.println("1.我是靜態塊,優先於構造塊執行!並且只有建立第一個物件的時候執行一次!");
    }
    {
        System.out.println("2.我是構造塊,優先於構造方法執行!每建立一個物件執行一次!");
    }
    public Person() {
        System.out.println("3.我是構造方法,每建立一個物件執行一次");
    }
    public void function1(){
        System.out.println("4. 我是非靜態方法中的普通程式碼塊,方法被呼叫時執行!");
    }
    public static void function2(){
        System.out.println("5. 我是靜態方法中的普通程式碼塊,方法被呼叫時執行,晚於靜態塊執行!");
    }
}

想一下,上述程式碼在執行的時候,輸出會是如何的順序?

答案是:1234,234,6,55

解刨一下這段短短的程式碼:
new Person().function1();

翻譯人話:通過構造器person(),建立Person物件,呼叫物件方法function1();
執行順序:構造器靜態塊1–>構造方法塊2–>構造器塊3–>物件普通方法塊4;

new Person().function1();
翻譯人話:重複建立Person物件,此時靜態構造器塊pass,其餘再來一遍;
執行順序:構造方法塊2–>構造器塊3–>物件普通方法塊4;

System.out.println("=…=");
Person.function2();
Person.function2();
翻譯人話:列印“=…=”;物件Person呼叫function2()兩次;
執行順序:3句話都是普通塊,不存在優先順序插隊,順序執行:
println普通塊6–>物件方法塊5–>物件方法塊5

所以,答案是 1234234655

Reference:
krisll 2017. 詳解java中的四種程式碼塊
https://www.jb51.net/article/129990.htm