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 逍遙晨空 閱讀(221) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 赤壁市| 靖宇县| 漳平市| 临桂县| 商城县| 隆尧县| 株洲县| 诸城市| 瑞金市| 湖州市| 富阳市| 花莲市| 精河县| 项城市| 淳安县| 华池县| 江永县| 东乌珠穆沁旗| 中方县| 如东县| 白朗县| 漳浦县| 大埔县| 唐海县| 灌云县| 武胜县| 唐山市| 郧西县| 旺苍县| 治多县| 喀喇沁旗| 永川市| 独山县| 古丈县| 黔江区| 莱阳市| 南丰县| 离岛区| 黔西| 泾川县| 甘洛县|