1. 程式人生 > >類的初始化順序---你真的明白嗎???^_^

類的初始化順序---你真的明白嗎???^_^


^_^基礎知識,要是不很明白的就看看吧。^_^

publicabstractclass Glyph {

abstractvoid draw();

Glyph(){

System.out.println("Glyph() before draw()");

draw();

System.out.println("Glyph() after draw()");

}

}

publicclass RoundGlyph extends Glyph {

privateintradius = 1;

RoundGlyph(int r){

//radius = r;

System.out.println(radius

);

System.out.println("RoundGlyph.RoundGlyph(),radius = "+radius);

}

void draw() {

System.out.println("RoundGlyph.draw(),radius = "+radius);

}

publicstaticvoid main(String[] args) {

RoundGlyph test = new RoundGlyph(10);

}

}

輸出:

Glyph() before draw()

RoundGlyph.draw(),radius = 0

Glyph() after draw()

1

RoundGlyph.RoundGlyph(),radius = 1

由此得出,初始化的實際過程是:

1、在其他任何事物發生之前,將分配給物件的儲存空間初始化成二進位制零。

2、呼叫基類構造器。這個步驟會不斷的反覆遞迴下去,首先是構造這種層次結構的根,然後是下一層匯出類,等等。直到最低層的匯出類。此時,呼叫被過載的draw()方法(是的,是在呼叫RoundGlyph構造器之前呼叫的),由於步驟(1)的緣故,我們此時會發現radius的值為0。

3、按照宣告的順序呼叫成員的初始化程式碼。在類的內部,初始化的順序是先“靜態”,(如果它們尚未因前面的物件建立過程而被初始化),後“非靜態”。而非靜態變數定義的順序決定了初始化的順序。即使變數定義散佈於方法定義之間,它們仍舊會在任何方法(包括構造器)被呼叫之前得到初始化。

4、呼叫匯出類的構造器主體。

不知道你看完後,感覺如何,如果不是這幾天惡補基礎知識,我......