寫構(gòu)造函數(shù)時(shí)應(yīng)該注意的
撰寫構(gòu)造函數(shù)時(shí),“盡可能簡(jiǎn)單的讓對(duì)象進(jìn)入正確狀態(tài)。如果可以的話別調(diào)用任何函數(shù)”,構(gòu)造函數(shù)中唯一可以安全調(diào)用的函數(shù)時(shí)“base class中的final函數(shù)和private函數(shù)”,這樣的函數(shù)無(wú)法被重寫。原因:看下列程序。
abstract class Glyph {
abstract void draw();
Glyph(){
System.out.println("Glyph() before draw()");
draw(); //注意這個(gè)函數(shù),他的調(diào)用順序
System.out.println("Glyph after draw()");
}
}
class RoundGlyph extends Glyph{
int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println{
"ToundGlyph.ToundGlyph(),radius = " + radius);
}
void draw(){
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors{
public static void main(String args[]){
new RoundGlyph(5);
}
}
輸出的結(jié)果是:Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
我們看到在超類的構(gòu)造函數(shù)中調(diào)用了一個(gè)抽象函數(shù)Draw(),這時(shí)radius尚未被初始化為1,所以其值為0。構(gòu)造函數(shù)中不會(huì)為某個(gè)調(diào)用函數(shù)進(jìn)行解析動(dòng)態(tài)綁定,找出它隸屬的class,他的任務(wù)是對(duì)象從無(wú)到有,他最終調(diào)用的這個(gè)函數(shù)是位于他最終被覆寫的那個(gè),而此時(shí)那個(gè)類還沒有完全初始化,這會(huì)造成災(zāi)難性的后果。(出自JAVA編程思想 P239)。
posted on 2006-03-13 11:50 Rockysnail 閱讀(330) 評(píng)論(0) 編輯 收藏 所屬分類: Java