java基礎總結(二十六)--例項化順序和載入順序總結
阿新 • • 發佈:2018-12-12
首先載入:載入順序: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-------