/* * Customer.java */ public class Customer { int t; public Customer(){ System.out.println("調用Customer的無參構造方法"); } static{ System.out.println("Customer 的靜態初始化塊"); } }
import java.io.*; public class Customer3 extends Customer implements Serializable { private static int count; //用於計算Customer3對象的數目 private static final int MAX_COUNT = 1000; private String name; private String password; static { System.out.println("調用Customer3類的靜態代碼塊 "); } public Customer3() { System.out.println("調用Customer3類的不帶參數的構造方法 "); count++; } public Customer3(String name, String password) { System.out.println("調用Customer3類的帶參數的構造方法 "); this.name = name; this.password = password; count++; } public String toString() { return "count= " + count + " MAX_COUNT= " + MAX_COUNT + " name= " + name + " password= " + password; } public static void main(String[] args) { for (int i = 0; i < 3; i++) { System.out.print("time:"+i+"/n"+new Customer3()); } } }
輸出結果:
Customer 的靜態初始化塊
調用Customer3類的靜態代碼塊
調用Customer的無參構造方法
調用Customer3類的不帶參數的構造方法
time:0
count= 1 MAX_COUNT= 1000 name= null password= null調用Customer的無參構造方法
調用Customer3類的不帶參數的構造方法
time:1
count= 2 MAX_COUNT= 1000 name= null password= null調用Customer的無參構造方法
調用Customer3類的不帶參數的構造方法
time:2
count= 3 MAX_COUNT= 1000 name= null password= null
調用帶參數的構造方法是結果相同
結論:對象初始化的順序,先靜態方法,再構造方法,每個又是先基類後子類。
================================================================================
相關文章,更全面:
著作權:(xiaodaoxiaodao)藍小刀 http://www.blogjava.net/xiaodaoxiaodao/archive/2007/06/06/122383.html
轉載請註明來源/作者
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. 子類構造方法
發表於 2007-06-06 15:59 藍小刀 閱讀(2070) 評論(9) 編輯 收藏 所屬分類: 個人學習筆記
--> 評論 你看不可以這樣理解
1,在new B一個執行個體時首長要進行類的裝載。
2,在裝載類時,先裝載父類A,再裝載子類B
3,裝載父類A後,完成靜態動著
4,裝載子類B後,完成靜態動著
好類裝載完成,開始進行執行個體化
1,在執行個體化子燈B時,先要執行個體化父類A
2,執行個體化父類A時,先成員執行個體化
3,父類A的建構函式
4,子類B的成員執行個體化
5,子類B的建構函式 評論於 2007-06-07 14:04 re: Java對象初始化順序 @中東
是的,上面的1/2是類的裝載時進行的,3/4/5/6是對象執行個體化時進行的,
如果你debug方式逐步執行看一看,可以看到執行完1/2之後斷點會回到main方法的new B();這一行,然後3/4/5/6依次執行
評論於 2007-06-07 18:10 re: Java對象初始化順序 高手啊,寫的真的挺好的,希望能多多指點。 評論於 2007-06-10 23:11 re: Java對象初始化順序 以前沒想過這個問題,不過運行結果也在情理之中。 評論於 2007-06-12 06:54 re: Java對象初始化順序
很好。不錯。 評論於 2008-01-13 22:25 re: Java對象初始化順序 受益良多,謝謝。 評論於 2008-06-17 11:03 re: Java對象初始化順序 不錯的東東,轉走了 評論於 2009-02-19 14:29 re: Java對象初始化順序 代碼似乎寫錯了, 評論於 2009-05-24 23:52 re: Java對象初始化順序 非常精彩,多謝。多謝。
另,請教一下調試的問題:該代碼在Eclipse下運行正確,但若想逐步執行,在main()行設定斷點,執行到main()再單步向下執行一步就出現source not found 請問其原因。 # re: Java對象初始化順序