版權所有:(xiaodaoxiaodao)藍小刀
http://www.aygfsteel.com/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.?
子類構造方法
1,在new B一個實例時首長要進行類的裝載。
2,在裝載類時,先裝載父類A,再裝載子類B
3,裝載父類A后,完成靜態動著
4,裝載子類B后,完成靜態動著
好類裝載完成,開始進行實例化
1,在實例化子燈B時,先要實例化父類A
2,實例化父類A時,先成員實例化
3,父類A的構造函數
4,子類B的成員實例化
5,子類B的構造函數
是的,上面的1/2是類的裝載時進行的,3/4/5/6是對象實例化時進行的,
如果你debug方式單步執行看一看,可以看到執行完1/2之后斷點會回到main方法的new B();這一行,然后3/4/5/6依次執行
很好!不錯!
另,請教一下調試的問題:該代碼在Eclipse下運行正確,但若想單步執行,在main()行設置斷點,執行到main()再單步向下執行一步就出現source not found 請問其原因?