和風細雨

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

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

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

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

          import java.util.Vector;

          /**
           * 基類BaseClass,ChildClass類的父類
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2007-12-4
           
          */
          public class BaseClass{
              
          // 私有動態(tài)數(shù)組成員,注意它是"private"的
              private Vector objects;
              
              
          /**
               * 在構造函數(shù)
               *
               
          */
              
          public BaseClass(){
                  objects
          =new Vector();
              }
              
              
          /**
               * 公有函數(shù),向動態(tài)數(shù)組成員objects添加字符串
               * 
          @param str
               
          */
              @SuppressWarnings(
          "unchecked")
              
          public void addStr2Obs(String str){
                  objects.add(str);
              }
              
              
          /**
               * 公有函數(shù),打印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函數(shù)中的childClass.printAll()上,看看實例childClass中到底有什么.


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

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

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

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

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

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


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

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

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

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 文成县| 志丹县| 青河县| 汉川市| 双桥区| 托克托县| 陈巴尔虎旗| 商城县| 兴国县| 新竹县| 绍兴市| 彰化县| 齐齐哈尔市| 梧州市| 基隆市| 磐安县| 新宁县| 泸州市| 鹿泉市| 包头市| 门源| 军事| 玉龙| 大宁县| 西青区| 瓦房店市| 河津市| 嘉义县| 保靖县| 沂水县| 土默特右旗| 石台县| 安国市| 金川县| 牙克石市| 吐鲁番市| 永靖县| 印江| 万宁市| 巴马| 诸暨市|