3278 7840

          1100111010001110 1001010010001010

          打破封裝的種類之一 :繼承

          一、繼承可以打破父類原有的封裝

          class Body
          {   String name;
              public Body(String name)
              {this.name=name;}
          }
          class ChildBody extends Body
          {
          private int age;
          }
          public class Test
          { public static void main(String[] args)
              {
                 Body Tom=new ChildBody();
              }
          }

          看看這段代碼,有沒有問題呢?能不能通過編譯呢?

           

          父類,沒有錯誤。子類繼承了父類,并添加了私有成員變量age

           

          看似沒有錯誤。

           

          編譯錯誤,沒有找到0參數的構造函數Body()

           

          這是為什么呢? 咱們沒有調用Body()呀

           

          只是直接調用的ChildBody()構造函數,而這個應該是由編譯器提供的呀?

           

          為什么這次它沒有提供呢?傻了嗎?

           

          可是

           

          究竟為什么呢?困惑中

           

          其實 ,事實不像看到的那樣

           

          1 類如果沒構造方法,編譯器會嘗試給創建一個默認的


          2 但是子類構造方法要用父類的構造方法來初始化其父類的東西


          3 這時候,編譯器就疑惑了,不能幫你合成了

          需要你顯示的來寫構造方法

          所以看出一個問題:


          繼承雖然提高代碼復用,但是子類的編寫者需要了解父類的設計細節,因此,繼承某種程度上

           

          打破了封裝

          我們對子類做一下修改,

          class ChildBody extends Body
          {
          private int age;

          public ChildBody(String name){

          super(name);

          }
          }

          而現在就應該可以通過編譯了

          我的分析是

          我們用了super()句子,就是調用了父類的構造方法

          而父類的此構造方法,則要調用它自己的父類無參構造函數

          大家知道類Body 隱式的繼承于Object

          也就是說,調用了Object的無參構造函數

          自然是可以成功編譯了

          posted on 2009-06-15 16:06 逍遙晨空 閱讀(224) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 仁化县| 清远市| 蒙山县| 荥阳市| 江安县| 灵武市| 锡林郭勒盟| 湘西| 西丰县| 涟水县| 廊坊市| 喀喇沁旗| 阆中市| 芜湖县| 龙里县| 杭州市| 宁都县| 会宁县| 文水县| 察雅县| 清原| 太康县| 商水县| 苍南县| 沭阳县| 嵩明县| 筠连县| 台北市| 合川市| 噶尔县| 巴东县| 长寿区| 怀来县| 榆社县| 额敏县| 噶尔县| 朝阳市| 融水| 福建省| 嘉兴市| 留坝县|