<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風博客

    春天里,百花香...

    導航

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

    統計

    公告

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

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

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

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

    首先請看兩個類的代碼:
    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://m.tkk7.com/Files/sitinspring/PrivatePuzzle20071204210542.rar

    posted on 2007-12-04 20:42 sitinspring 閱讀(9948) 評論(7)  編輯  收藏 所屬分類: Object Orient Programming 、Java基礎

    評論

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

    佩服,用debug應該很能說明問題拉.
      回復  更多評論   

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

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

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

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

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

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

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

    這個,當然是可以繼承的,不過我認為這篇文章如果把對象繼承的內存模型畫出來就更好了:能從本質上說明問題  回復  更多評論   

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

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

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

    @sie

    你運行程序了嗎?!  回復  更多評論   

    sitinspring(http://m.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 亚洲码和欧洲码一码二码三码 | 日本一区免费电影| 亚洲国产精品午夜电影| 久久国产精品一区免费下载| 亚洲av午夜福利精品一区| 亚洲欧洲日产专区| 亚洲免费电影网站| 成人国产mv免费视频| 自拍偷自拍亚洲精品播放| 久青草视频97国内免费影视| 91成人免费在线视频| 亚洲色欲久久久久综合网| 高清免费久久午夜精品 | 四虎永久在线观看免费网站网址 | 99国产精品永久免费视频| 18gay台湾男同亚洲男同| 男女免费观看在线爽爽爽视频| 亚洲人成网www| 曰批全过程免费视频在线观看 | 亚洲成在人线在线播放无码 | 久久午夜免费视频| 亚洲日韩一区精品射精| 全黄性性激高免费视频| a级毛片在线免费| 亚洲精品偷拍视频免费观看| 亚洲中文字幕久在线| 日本免费一区尤物| 99精品全国免费观看视频..| 亚洲综合综合在线| 日本高清免费中文字幕不卡| 久久久久免费视频| 亚洲一区二区三区高清不卡 | 亚洲爽爽一区二区三区| 亚洲a一级免费视频| 亚洲乱码精品久久久久..| 日韩精品免费一级视频| 污污免费在线观看| 亚洲精品一区二区三区四区乱码| 永久免费AV无码网站在线观看| 中文在线免费看视频| 亚洲大成色www永久网址|