春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

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

          如果你的答案是斬釘截鐵的"不能",那么請你繼續(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;
              
              
          /**
               * 在構(gòu)造函數(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();
              }
          }

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


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

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

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

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

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

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


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

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

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

          posted on 2007-12-04 20:42 sitinspring 閱讀(9956) 評論(7)  編輯  收藏 所屬分類: Object Orient ProgrammingJava基礎(chǔ)

          評論

          # re: 私有的成員能被子類繼承嗎? 2007-12-04 22:17 Matthew Chen

          佩服,用debug應(yīng)該很能說明問題拉.
            回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2007-12-04 23:18 Edward's

          搞這么麻煩,用發(fā)射就能得到父類的私有屬性  回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2007-12-05 09:32 ruderal

          這樣設(shè)計不應(yīng)該說有沒意義,應(yīng)該說很合理.
          如果子類沒有私有objects對象,那addStr2Obs方法里面的objects又是什么?沒聲明的對象?!  回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2007-12-05 09:50 mlhorizon

          書上不是說明了,你new出來的子類中其實(shí)就有一個父類的拷貝啊,要不然你的super指向哪里了!!這樣子能使用父類的方法和對象就不稀奇了哈!!  回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2007-12-05 11:39 10:10

          這個,當(dāng)然是可以繼承的,不過我認(rèn)為這篇文章如果把對象繼承的內(nèi)存模型畫出來就更好了:能從本質(zhì)上說明問題  回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2012-02-12 21:18 sie

          這篇文章有誤人嫌疑,請看Java語言官方規(guī)范,明確寫著私有成員不能被繼承。  回復(fù)  更多評論   

          # re: 私有的成員能被子類繼承嗎? 2012-04-18 16:15 何楊

          @sie

          你運(yùn)行程序了嗎?!  回復(fù)  更多評論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 腾冲县| 册亨县| 崇州市| 京山县| 霍州市| 柳江县| 鹤庆县| 卓资县| 辽阳县| 金坛市| 沁阳市| 利川市| 高要市| 万山特区| 同江市| 深圳市| 中牟县| 夹江县| 昭平县| 海口市| 肇州县| 哈巴河县| 班戈县| 高唐县| 定州市| 宣汉县| 高碑店市| 思茅市| 赤峰市| 建始县| 平安县| 微山县| 兴业县| 武清区| 霍邱县| 米易县| 广宁县| 治多县| 静海县| 香港 | 台安县|