1. 程式人生 > >java基礎總結(二十六)--例項化順序和載入順序總結

java基礎總結(二十六)--例項化順序和載入順序總結

      首先載入:載入順序:1.靜態屬性定義 2.靜態方法宣告 (定義和宣告完全結束後) 3. 靜態屬性賦值 4.靜態塊

      其次例項化:例項化順序:1.普通屬性定義、2. 普通方法宣告 (定義和宣告完全結束後)3.普通屬性賦值 4.構造塊 (以上完全結束後) 構造方法中的程式碼

public class People {
    String name;

    public People() {
        System.out.print(1);
    }

    public People(String name) {
        System.out.print(2);
        this.name = name;
    }
    
    public static void main(String[] args) {
		new Child("maki");//--呼叫子類的有參構造
	}
}

class Child extends People {
    People father;

    public Child(String name) {
    	//--每個子類的構造方法的第一行都預設執行了一個super();父類的無參構造
    	//--如果要呼叫父類的其他構造方法,必須在第一行顯式呼叫
    	//--如果父類沒有無參構造,那麼必須顯式呼叫有參構造,否則會報錯
        System.out.print(3);
        this.name = name;
        father = new People(name + ":F");
    }

    public Child() {
        System.out.print(4);
    }
    
}

//--以上程式執行結果:132

 

 

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

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-------