^_^基礎(chǔ)知識,要是不很明白的就看看吧。^_^
public
abstract class Glyph {
abstract void draw();
Glyph(){
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
public class RoundGlyph extends Glyph {
private int radius = 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);
}
public static void main(String[] args) {
RoundGlyph test = new RoundGlyph(10);
}
}
輸出:
Glyph() before draw()
RoundGlyph.draw(),radius = 0
Glyph() after draw()
1
RoundGlyph.RoundGlyph(),radius = 1
由此得出,初始化的實際過程是:
1、在其他任何事物發(fā)生之前,將分配給對象的存儲空間初始化成二進制零。
2、調(diào)用基類構(gòu)造器。這個步驟會不斷的反復(fù)遞歸下去,首先是構(gòu)造這種層次結(jié)構(gòu)的根,然后是下一層導(dǎo)出類,等等。直到最低層的導(dǎo)出類。此時,調(diào)用被重載的draw()方法(是的,是在調(diào)用RoundGlyph構(gòu)造器之前調(diào)用的),由于步驟(1)的緣故,我們此時會發(fā)現(xiàn)radius的值為0。
3、按照聲明的順序調(diào)用成員的初始化代碼。在類的內(nèi)部,初始化的順序是先“靜態(tài)”,(如果它們尚未因前面的對象創(chuàng)建過程而被初始化),后“非靜態(tài)”。而非靜態(tài)變量定義的順序決定了初始化的順序。即使變量定義散布于方法定義之間,它們?nèi)耘f會在任何方法(包括構(gòu)造器)被調(diào)用之前得到初始化。
4、調(diào)用導(dǎo)出類的構(gòu)造器主體。
不知道你看完后,感覺如何,如果不是這幾天惡補基礎(chǔ)知識,我......