static變數,static程式碼塊,建構函式,程式碼塊等的載入順序

weixin_33913332發表於2018-11-15
public class Main {
    public Main() {
        System.out.println("construct invoke");  // 執行順序6
    }
    static int i = 4;  // 執行順序1
    static {
        i++;
        System.out.println("first static invoke i = " + i);  // 執行順序2
    }
    private int j = 0;  // new 物件之後才會開始執行  執行順序4
    {
        System.out.println("匿名程式碼塊執行" + j);  // new 之後才執行  執行順序5
    }
    static {
        System.out.println("second static invoke");  // 執行順序3
    }
    static void fun() {
        System.out.println("call static function");  // 只有在呼叫的時候才會執行
    }
    public static void main(String [] args) {
        new Main();
        Main.fun();
    }
}

執行結果:


10898735-908e68f144578661.png
image.png
  • 在類載入階段,先順序執行static變數的賦值
  • 順序執行static程式碼塊(static程式碼塊只有在類載入的時候,才會執行,發生在類載入的初始化階段,putstatic、getstatic、invokestatic、new指令一定會觸發初始化階段)

以下程式碼塊只發生在例項物件時,並且沒例項化一次物件,都會執行一輪

  • 先順序執行內部變數賦值
  • 順序執行匿名程式碼塊
  • 執行建構函式

靜態方法只有在呼叫的時候,會有執行。

相關文章