類的執行個體化順序__java

來源:互聯網
上載者:User

/* * 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對象初始化順序

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.