java實例化對象的初始化順序

java 對象是如何進行初始化的,新建一PrintClass.java文件如下(包括類PrintClass以及A和其子類B),編譯運行其中的main方法,

public class PrintClass { 
    public static void main(String[] args){ 
        new B(); 
    } 
    PrintClass(String var) { 
        System.out.println(var); 
    } 
} 

class A { 
    static PrintClass pClassA1 = new PrintClass("A. 靜態成員的初始化1"); 
    static { 
        System.out.println("A. 靜態初始化塊1"); 
    } 
    static { 
        System.out.println("A. 靜態初始化塊2"); 
    } 
    static PrintClass pClassA2 = new PrintClass("A. 靜態成員的初始化2"); 

    { 
        System.out.println("A. 實例初始化塊1"); 
    } 
    PrintClass pClassA = new PrintClass("A. 實例成員的初始化"); 
    { 
        System.out.println("A. 實例初始化塊2"); 
    } 

    public int Avar; 
    public A() { 
        System.out.println("A. 構造方法"); 
        doSomething(); 
    } 

    private void doSomething() { 
//    public void doSomething() { 
        Avar = 1111; 
        System.out.println("Avar=" + Avar); 
    } 
} 

//class B extends A 
class B extends A 
{ 
    public static void main(String[] args){ 
        new B(); 
    } 
    public int Bvar = 2222; 

    { 
        System.out.println("B. 實例初始化塊1"); 
    } 
    { 
        System.out.println("B. 實例初始化塊2"); 
    } 
    PrintClass pClassB = new PrintClass("B. 實例成員的初始化"); 

    static { 
        System.out.println("B. 靜態初始化塊1"); 
    } 
    static PrintClass pClassB1 = new PrintClass("B. 靜態成員的初始化1"); 
    static PrintClass pClassB2 = new PrintClass("B. 靜態成員的初始化2"); 
    static { 
        System.out.println("B. 靜態初始化塊2"); 
    } 

    public B() { 
        System.out.println("B. 構造方法"); 
        doSomething(); 
    } 
    public void doSomething() { 
        System.out.println("Bvar=" + Bvar); 
    } 
} 
 可以看到運行結果爲:

A. 靜態成員的初始化1
A. 靜態初始化塊1
A. 靜態初始化塊2
A. 靜態成員的初始化2
B. 靜態初始化塊1
B. 靜態成員的初始化1
B. 靜態成員的初始化2
B. 靜態初始化塊2
A. 實例初始化塊1
A. 實例成員的初始化
A. 實例初始化塊2
A. 構造方法
Avar=1111
B. 實例初始化塊1
B. 實例初始化塊2
B. 實例成員的初始化
B. 構造方法
Bvar=2222

由此可知當新建一java對象(上面main方法中new B())時,它的內部初始化順序爲:
1. 父類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
2. 子類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
3. 父類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
4. 父類構造方法
5. 子類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
6. 子類構造方法

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 7218
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章