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)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 萝北县| 鄂州市| 湟源县| 葵青区| 乐平市| 英吉沙县| 晋江市| 永登县| 兴城市| 定兴县| 独山县| 武邑县| 大埔县| 阿瓦提县| 莱西市| 湖北省| 大城县| 和龙市| 平阴县| 神农架林区| 黄梅县| 项城市| 光山县| 平南县| 万宁市| 鄱阳县| 漠河县| 永川市| 万载县| 乌海市| 余庆县| 廉江市| 额济纳旗| 青海省| 桐城市| 张掖市| 杭锦旗| 贵港市| 汝城县| 和田县| 迁安市|