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

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

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

    慘淡人生,平淡生活

    The Feature Is Stupid

    關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略

    今天在TSS上又看到有人討論java多繼承的問(wèn)題,是想起這個(gè)話題的原因。^_^


    java中任何類都默認(rèn)繼承 Java.lang.Object,除非被另一個(gè)繼承覆蓋(override),hoho 俺一直這么稱呼override的,感覺(jué)更加貼切一些。
    請(qǐng)看以下代碼:

    package org.myth.test;

    public class SuperSon{
        
        SuperSon(){
            System.out.println(
    "this is super son");
        }

    }

    對(duì)于編譯器來(lái)說(shuō),這段代碼會(huì)被首先補(bǔ)全為:

    package org.myth.test;

    public class SuperSon extends Object{
        
        SuperSon(){
            System.out.println(
    "this is super son");
        }

    }

    對(duì)待任何一個(gè)類,編譯器會(huì)去檢查extends關(guān)鍵字,如果沒(méi)有,編譯器會(huì)默認(rèn)添加extens Object

    extends Object就是一段默認(rèn)隱藏的代碼,同樣在Constructor中,也有一段默認(rèn)隱藏的代碼。

    package org.myth.test;

    public class SuperSon extends Object{
        
        SuperSon(){
            
    super();//這就是一段默認(rèn)隱藏代碼
            System.out.println("this is super son");
        }

        //
    整個(gè)構(gòu)造方法也是一段默認(rèn)隱藏代碼

    }

    如同編譯類時(shí)編譯器回去檢查extends關(guān)鍵字一樣,編譯器會(huì)首先檢查是否存在constructor,如果沒(méi)有,默認(rèn)增加ClassName()構(gòu)造方法。
    在構(gòu)造方法內(nèi)部,編譯器會(huì)檢查第一行代碼是否為super構(gòu)造方法,如果不是,默認(rèn)添加super()

    這個(gè)就是為什么 new一個(gè)對(duì)象的時(shí)候,首先調(diào)用的是父類的構(gòu)造方法。

    一個(gè)錯(cuò)誤代碼示例:
    package org.myth.test;

    public class SuperMan {
        
        SuperMan(String s){
            System.out.println(
    "this is super man");
        }

    }



    package org.myth.test;

    public class SuperSon extends SuperMan{
        
        SuperSon(){
            System.out.println(
    "this is super son");
        }

    }


    嘿嘿 第一篇文章

    posted on 2008-05-28 10:44 季失羽 閱讀(1298) 評(píng)論(10)  編輯  收藏

    評(píng)論

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-28 11:11 Happy漫步者

    不錯(cuò) 關(guān)注下^_^  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-28 11:13 Happy漫步者

    第一篇文章 我收藏拉   回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-28 11:40 隔葉黃鶯

    博主可由此延展一下,在父類沒(méi)有默認(rèn)構(gòu)造函數(shù)時(shí),對(duì)子類構(gòu)造函數(shù)有什么要求。  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-28 13:41 季失羽

    @隔葉黃鶯
    這個(gè)問(wèn)題,你看我最后一個(gè)錯(cuò)誤代碼示例 就知道了 ^_^  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略[未登錄](méi) 2008-05-28 21:26 Matthew Chen

    黃鶯真的很認(rèn)真啊。
    對(duì)于lz說(shuō)的被另一個(gè)繼承覆蓋(override)的說(shuō)法,怎么看得別扭,就是繼承自非object的類就好了,沒(méi)必要太復(fù)雜。  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-28 21:41 隔葉黃鶯

    最后一段錯(cuò)誤代碼,你還沒(méi)有說(shuō)明白錯(cuò)誤的原因,也沒(méi)給出解決的辦法。

    只要知道子類和父類之間是一種 Has-A 的關(guān)系就好理解了,在父類沒(méi)有默認(rèn)構(gòu)造方法時(shí),在創(chuàng)建子類實(shí)例時(shí),它就無(wú)從獲悉該如何實(shí)例化出它的部分--父類實(shí)例,super() 已經(jīng)不見(jiàn)效了,因?yàn)楦割惒淮嬖?super() 了,所以就要求在子類的構(gòu)造方法中顯式的調(diào)用父類的某個(gè)構(gòu)造方法。  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-29 10:00 季失羽

    @隔葉黃鶯
    在構(gòu)造方法內(nèi)部,編譯器會(huì)檢查第一行代碼是否為super構(gòu)造方法,如果不是,默認(rèn)添加super()
    按照上面這句話的理解 就是
    package org.myth.test;

    public class SuperSon extends SuperMan{

    SuperSon(){
    System.out.println("this is super son");
    }

    }

    其實(shí)等同于
    package org.myth.test;

    public class SuperSon extends SuperMan{

    SuperSon(){
    super();
    System.out.println("this is super son");
    }

    }

    顯然,父類中是不存在無(wú)參數(shù)構(gòu)造方法的,所以編譯器回報(bào)錯(cuò),不存在super()構(gòu)造方法。


    另外,對(duì)于您說(shuō)的has-a的關(guān)系,特定界定之下可以這么講,但是更準(zhǔn)確而言,子類是父類 應(yīng)該是is a 的關(guān)系。  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-29 10:02 季失羽

    @Matthew Chen
    是,繼承另一個(gè)類也許更加清楚一些,但是 既然文章的主要意思是說(shuō)默認(rèn)實(shí)現(xiàn)與覆蓋關(guān)系的 hoho 這么說(shuō)是一種慣性XD  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略 2008-05-29 12:28 隔葉黃鶯

    要繼承一個(gè)無(wú)默認(rèn)構(gòu)造方法的父類,在子類中應(yīng)如何處理還可以說(shuō)明白一些

    其實(shí)只要記住這一點(diǎn),在構(gòu)造子類實(shí)例前必須構(gòu)造一個(gè)父類實(shí)例作為子類實(shí)例的部分,所以從這一層面講存在一種 has-a 關(guān)系。

    在C++或某些具體面對(duì)象的C組件中很清楚體現(xiàn)這一點(diǎn),父類實(shí)例要放在子類實(shí)例的首地址,所以才能保證向上安全轉(zhuǎn)型

    如果沒(méi)有默認(rèn)增加ClassName()構(gòu)造方法。 這句話不是很好理解,沒(méi)有增加ClassName()構(gòu)造方法是人的行為,不存在是否默認(rèn)

    關(guān)于對(duì)象模型,C++有些書(shū)籍講述的比較透沏。  回復(fù)  更多評(píng)論   

    # re: 關(guān)于extends 和 constructor的默認(rèn)實(shí)現(xiàn)與覆蓋策略[未登錄](méi) 2008-05-29 19:08 季失羽

    @隔葉黃鶯
    在構(gòu)造子類實(shí)例前必須構(gòu)造一個(gè)父類實(shí)例作為子類實(shí)例的部分
    這句話太正確了。

    如果沒(méi)有默認(rèn)增加ClassName()構(gòu)造方法。
    暈,剛剛發(fā)現(xiàn),句讀錯(cuò)了,中間有個(gè)逗號(hào)。汗一個(gè) XD
    如果沒(méi)有,默認(rèn)增加ClassName()構(gòu)造方法。

    其實(shí) 俺這篇文字 完全可以三句話說(shuō)完的

    第一句,任何一個(gè)類都有Constructor
    第二句,任何一個(gè)類的Constructor第一行代碼就是調(diào)用父類的構(gòu)造函數(shù)
    第三局,就是 以上兩句說(shuō)的東西,你可以代碼中不寫(xiě),因?yàn)橛心J(rèn)實(shí)現(xiàn),并且默認(rèn)實(shí)現(xiàn)與編碼出來(lái)的實(shí)現(xiàn)不能并存,會(huì)被覆蓋。

    XD 騙字?jǐn)?shù)而已 XD  回復(fù)  更多評(píng)論   


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品午夜免费观看网站| 无码专区永久免费AV网站| 亚洲国产一区二区三区青草影视| a拍拍男女免费看全片| 国产成人精品亚洲一区| 久久亚洲一区二区| 永久免费看bbb| 国内精品免费在线观看 | 羞羞漫画在线成人漫画阅读免费| 亚洲人成网站在线观看青青| 亚洲黄色免费网址| 高清免费久久午夜精品| 亚洲国产精品成人精品软件| 国产成人亚洲精品影院| 久久受www免费人成_看片中文| 一区二区三区视频免费观看| 亚洲一区二区三区播放在线| 亚洲国产另类久久久精品黑人 | 好看的亚洲黄色经典| 日韩一区二区在线免费观看| 香蕉免费一区二区三区| 免费人成大片在线观看播放电影| 久久久久亚洲精品天堂| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲精品欧美综合四区| 亚洲视频一区调教| 亚洲熟女乱综合一区二区| 女人18毛片水最多免费观看| 久久亚洲免费视频| 国产精品成人啪精品视频免费| 久久精品国产亚洲av麻豆图片| 亚洲AV无码乱码在线观看裸奔| 四虎永久免费网站免费观看| 日本免费网址大全在线观看| 成人爽a毛片免费| 又粗又长又爽又长黄免费视频 | 一区二区无码免费视频网站| 午夜免费福利视频| 韩国免费A级毛片久久| 全部在线播放免费毛片| 美国毛片亚洲社区在线观看|