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

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

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

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2007年12月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統(tǒng)計(jì)

    公告

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

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

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

    首先請(qǐng)看兩個(gè)類的代碼:
    BaseClass:
    package com.sitinspring;

    import java.util.Vector;

    /**
     * 基類BaseClass,ChildClass類的父類
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2007-12-4
     
    */
    public class BaseClass{
        
    // 私有動(dòng)態(tài)數(shù)組成員,注意它是"private"的
        private Vector objects;
        
        
    /**
         * 在構(gòu)造函數(shù)
         *
         
    */
        
    public BaseClass(){
            objects
    =new Vector();
        }
        
        
    /**
         * 公有函數(shù),向動(dòng)態(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(
    "序號(hào)="+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(){
            
    // 下面的句子是不能編譯通過(guò)的
            /*for(int i=0;i<objects.size();i++){
                System.out.println("序號(hào)="+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的成員,而且四個(gè)字符串也都被加進(jìn)去了.

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

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

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

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

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


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

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

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

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

    評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

    @sie

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

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: xxxx日本免费| 国产福利免费视频| 免费在线看v网址| 亚洲视频日韩视频| 免费观看国产网址你懂的| 亚洲欧洲精品视频在线观看| 在线观看的免费网站无遮挡| 久久亚洲精品无码VA大香大香 | 亚洲午夜福利在线视频| 99re热免费精品视频观看| 亚洲日本成本人观看| 国产成人aaa在线视频免费观看| 无码一区二区三区亚洲人妻| 亚洲成a人在线看天堂无码| 香蕉视频在线观看免费| 不卡一卡二卡三亚洲| 国产激情免费视频在线观看 | 香蕉大伊亚洲人在线观看| 国产h肉在线视频免费观看| 亚洲第一二三四区| 四虎免费大片aⅴ入口| 日韩精品视频在线观看免费| 亚洲精品无码久久久久去q| 无码精品国产一区二区三区免费 | 亚洲国产精品一区第二页| 久久国产精品成人片免费| 亚洲中文无码亚洲人成影院| 免费在线观看一级毛片| 久久这里只精品99re免费| 亚洲一卡二卡三卡四卡无卡麻豆| 日本v片免费一区二区三区| 岛国岛国免费V片在线观看| 亚洲欧洲国产精品久久| 全黄性性激高免费视频| 嫩草影院在线播放www免费观看| 亚洲的天堂av无码| 免费成人av电影| 最近新韩国日本免费观看| 爱情岛论坛免费视频| 亚洲黄色免费网址| 亚洲成AV人网址|