1. 程式人生 > >static語句塊、構造語句塊(就是隻有大括號的那塊)以及建構函式的執行順序

static語句塊、構造語句塊(就是隻有大括號的那塊)以及建構函式的執行順序

class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }
    
    { System.out.println("I'm A class"); }
    
    static { System.out.println("static A"); }

}

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
    
    { System.out.println(
"I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) {      new HelloB();    } } 執行結果是:
static A
static B
I'm A class
HelloA
I'm B class
HelloB

分析:

物件的初始化順序:(1)類載入之後,按從上到下(從父類到子類)執行被static修飾的語句;(2)當static語句執行完之後,再執行main方法;(3)如果有語句new了自身的物件,將從上到下執行構造程式碼塊、構造器(兩者可以說繫結在一起)。

下面稍微修改下上面的程式碼,以便更清晰的說明情況:

class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }
    
    { System.out.println("I'm A class"); }
    
    static { System.out.println("static A"); }

}

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
    
    { System.out.println(
"I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { System.out.println("-------main start-------"); new HelloB(); new HelloB(); System.out.println("-------main end-------"); } }
輸出結果:
static A
static B
-------main start-------
I'm A class
HelloA
I'm B class
HelloB
I'm A class
HelloA
I'm B class
HelloB
-------main end-------