Rocky Snail(小蝸牛)

          一步一步往上爬、小小的天、大大的夢想、 強健體魄、充實頭腦

           

          寫構造函數時應該注意的

          撰寫構造函數時,“盡可能簡單的讓對象進入正確狀態。如果可以的話別調用任何函數”,構造函數中唯一可以安全調用的函數時“base class中的final函數和private函數”,這樣的函數無法被重寫。
          原因:看下列程序。
               abstract class Glyph {
                      abstract void draw();
                    Glyph(){
                       System.out.println("Glyph() before draw()");
                       draw();  //注意這個函數,他的調用順序
                       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);
                  }
          }
          輸出的結果是:Glyph() before draw()
                                      RoundGlyph.draw(), radius = 0
                                       Glyph() after draw()
                                       RoundGlyph.RoundGlyph(),  radius = 5
          我們看到在超類的構造函數中調用了一個抽象函數Draw(),這時radius尚未被初始化為1,所以其值為0。構造函數中不會為某個調用函數進行解析動態綁定,找出它隸屬的class,他的任務是對象從無到有,他最終調用的這個函數是位于他最終被覆寫的那個,而此時那個類還沒有完全初始化,這會造成災難性的后果。(出自JAVA編程思想 P239)。

          posted on 2006-03-13 11:50 Rockysnail 閱讀(330) 評論(0)  編輯  收藏 所屬分類: Java

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 正镶白旗| 荔波县| 洛扎县| 隆化县| 平阳县| 太仆寺旗| 玛沁县| 荣成市| 道孚县| 丰镇市| 长泰县| 昭通市| 曲阳县| 汶上县| 景德镇市| 陇川县| 闵行区| 调兵山市| 西和县| 呼图壁县| 阿克苏市| 尖扎县| 梁平县| 宜丰县| 黄骅市| 大竹县| 芦溪县| 正定县| 哈巴河县| 滕州市| 石渠县| 阿拉善右旗| 铁岭市| 海口市| 景东| 东兰县| 华池县| 台安县| 福建省| 连州市| 府谷县|