和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          私有的成員能被子類繼承嗎?

          如果你的答案是斬釘截鐵的"不能",那么請你繼續向下看,說不定這篇文章能對你有所用處.

          首先請看兩個類的代碼:
          BaseClass:
          package com.sitinspring;

          import java.util.Vector;

          /**
           * 基類BaseClass,ChildClass類的父類
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2007-12-4
           
          */
          public class BaseClass{
              
          // 私有動態數組成員,注意它是"private"的
              private Vector objects;
              
              
          /**
               * 在構造函數
               *
               
          */
              
          public BaseClass(){
                  objects
          =new Vector();
              }
              
              
          /**
               * 公有函數,向動態數組成員objects添加字符串
               * 
          @param str
               
          */
              @SuppressWarnings(
          "unchecked")
              
          public void addStr2Obs(String str){
                  objects.add(str);
              }
              
              
          /**
               * 公有函數,打印objects中的諸元素
               *
               
          */
              
          public void printAll(){
                  
          for(int i=0;i<objects.size();i++){
                      System.out.println(
          "序號="+i+"\t元素="+objects.get(i));
                  }
              }
          }

          ChildClass,BaseClass的派生類:
          package com.sitinspring;

          /**
           * ChildClass,BaseClass的派生類
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2007-12-4
           
          */
          public class ChildClass extends BaseClass{
              
          public void printObjects(){
                  
          // 下面的句子是不能編譯通過的
                  /*for(int i=0;i<objects.size();i++){
                      System.out.println("序號="+i+"\t元素="+objects.get(i));
                  }
          */
              }
              
              
          public static void main(String[] args){
                  ChildClass childClass
          =new ChildClass();
                  
                  childClass.addStr2Obs(
          "Hello");
                  childClass.addStr2Obs(
          "World");
                  childClass.addStr2Obs(
          "China");
                  childClass.addStr2Obs(
          "sitinspring");
                  
                  childClass.printAll();
              }
          }

          再讓我們把斷點停在main函數中的childClass.printAll()上,看看實例childClass中到底有什么.


          以上截圖證明:objects確實是ChildClass類實例childClass的成員,而且四個字符串也都被加進去了.

          最后執行出來,結果如下:
          序號=0    元素=Hello
          序號
          =1    元素=World
          序號
          =2    元素=China
          序號
          =3    元素=sitinspring

          這也說明,上面紅字部分的論斷是正確的.

          再翻看書籍,關于private限制的成員變量是這樣寫的:
          private  只允許來自改類內部的方法訪問.不允許任何來自該類外部的訪問.

          我們上面添字符串和遍歷輸出函數都是BaseClass的成員,所以它當然被這兩個函數訪問.而ChildClass的printObjects是BaseClass類外部的函數,結果當然是編譯也不能通過.

          實際上,private,public,protected和繼承沒有關系,他們對成員函數和變量的限制只是在成員的可見性上,
          public允許來自任何類的訪問;
          private只允許來自改類內部的方法訪問,不允許任何來自該類外部的訪問;
          protected允許來自同一包中的任何類以及改類的任何地方的任何子類的方法訪問.


          而關于成員變量的繼承,父類的任何成員變量都是會被子類繼承下去的,私有的objects就是明證,這些繼承下來的私有成員雖對子類來說不可見,但子類仍然可以用父類的函數操作他們.

          這樣的設計有何意義呢?我們可以用這個方法將我們的成員保護得更好,讓子類的設計者也只能通過父類指定的方法修改父類的私有成員,這樣將能把類保護得更好,這對一個完整的繼承體系是尤為可貴的. jdk源碼就有這樣的例子,java.util.Observable就是這樣設計的.

          本文例子下載:
          http://www.aygfsteel.com/Files/sitinspring/PrivatePuzzle20071204210542.rar

          posted on 2008-02-22 10:29 和風細雨 閱讀(306) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 区。| 新源县| 贵港市| 右玉县| 庆元县| 磴口县| 遵义市| 额尔古纳市| 大竹县| 宁河县| 郑州市| 邻水| 增城市| 手游| 西华县| 灵山县| 万源市| 惠东县| 遵义市| 工布江达县| 崇信县| 琼中| 襄垣县| 离岛区| 哈密市| 镇安县| 宁明县| 炎陵县| 建瓯市| 宜兰县| 修武县| 临西县| 蓬莱市| 怀来县| 美姑县| 长春市| 崇仁县| 庄浪县| 东丽区| 鸡西市| 山东省|