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

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

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

    邊城愚人

    如果我不在邊城,我一定是在前往邊城的路上。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks

    ??? ??? 題按:做了幾年的java程序,卻很難說對基本的OO概念都有理解。即便每天都寫的代碼中,也很難說清楚其中到底運用了怎樣的概念和思想。前日的考試中看到關于上溯造型與下溯造型的問題,就查了些資料,集中說一下吧。

    ??? ??? 先給出個例子,代碼如下:

    package ?casting;
    public ? abstract ? class ?Animal?{
    ????
    public ? abstract ? void ?speak();
    ????
    public ? void ?eat(){
    ????????
    // 悶頭吃,不做額外的事情
    ????}
    }

    package ?casting;

    public ? interface ?DoorGod?{
    ????
    void ?guard();
    }


    package ?casting;

    public ? class ?Cat? extends ?Animal?{

    ????@Override
    ????
    public ? void ?eat()?{
    ????????
    try ?{
    ????????????Thread.sleep(
    1000 );
    ????????}?
    catch ?(InterruptedException?e)?{
    ????????????e.printStackTrace();
    ????????}
    ????????
    super .eat();
    ????}

    ????@Override
    ????
    public ? void ?speak()?{
    ????????System.out.println(
    " 喵喵 " );
    ????}

    }

    package ?casting;

    public ? class ?Dog? extends ?Animal? implements ?DoorGod{

    ????@Override
    ????
    public ? void ?speak()?{
    ????????System.out.println(
    " 汪汪 " );
    ????}

    ????
    public ? void ?guard()?{
    ????????
    while ( true ){
    ????????????System.out.println(
    " 汪汪 " );
    ????????}
    ????}
    ????
    }

    ???? 其中Animal為基類,定義speakeat方法,eat方法給出了空實現; DoorGod為門神接口,定義了 guard方法來守護家門; Cat為繼承Animal的子類,這里假定貓有挑食的習慣,在eat中要耽擱點時間看看伙食;Dog也為繼承Animal的子類,同時它實現了DoorGod接口來守護家門。

    ??? ??? 先說說上溯造型(upcasting)。這個術語緣于繼承關系圖的傳統畫法:將基類至于頂部,而向下發展的就是派生類。根據上面的sample,我給出下面的一個小應用:


    package?casting;

    public?class?Main?{

    ????
    public?static?void?upcasting(Animal?animal){
    ????????animal.speak();
    ????????animal.eat();
    ????}
    ????
    public?static?void?main(String[]?args)?{
    ????????Animal?dog1?
    =?new?Dog();
    ????????upcasting(dog1);
    ????????
    ????????Dog?dog2?
    =?new?Dog();
    ????????upcasting(dog2);
    ????}

    }

    ??? ??? 由于upcasting(Animal animal)方法的參數是 Animal類型的,因此如果傳入的參數是 Animal的子類,傳入的參數就會被轉換成父類Animal類型,這樣你創建的Dog對象能使用的方法只是Animal中的簽名方法;也就是說,在上溯的過程中,Dog的接口變窄了,它本身的一些方法(例如實現了 DoorGodguard方法)就不可見了。如果你想使用Dog中存在而Animal中不存在的方法(比如guard方法),編譯時不能通過的。由此可見,上溯造型是安全的類型轉換。另一方面,雖然upcasting(Animal animal)方法的參數是 Animal類型,但傳入的參數可以是Animal的派生類(這也是OO編程中慣用的編程方法),這里面就有個對象的類型識別問題,也就是運行時類型識別(run-time type identification,縮寫為RTTI) ,這也可以單獨寫一篇文章了,《Thinking in Java》中的第10章詳細地闡述了RTTI

    ??? ??? 相對于類型轉換安全的上溯造型,下溯造型就未必是安全的了。我們經常會做些強制類型轉換的事情,有時我們也會無意間遇到 ClassCastException的轉換異常(從這一點來說,我們應該多用范型來避免不安全的類型轉換)。例如:


    public?static?void?downcasting(Animal?animal){
    ????????
    //DoorGod?doorGod?=?(DoorGod)animal;
    ????????if(animal?instanceof?DoorGod){
    ????????????DoorGod?doorGod?
    =?(DoorGod)animal;
    ????????????doorGod.guard();
    ????????}
    ????????
    if(animal?instanceof?Cat){
    ????????????Cat?cat?
    =?(Cat)animal;
    ????????????cat.speak();
    ????????}

    } ???

    如果沒有采取措施(上面使用的措施是instanceof)判斷對象的類型,那么向下的強制轉換就是不安全的。這種轉換錯誤在編譯時是不能檢測出來的,只有在運行時才會拋出 ClassCastException異常,對于測試來說,這樣的錯誤也是很難檢測的。

    總的來說,上溯造型與下溯造型概念上還是很簡單的。但即便最簡單的東西,我們也有可能犯下錯誤。用了那么多的框架后,回頭看看基礎知識,發現自己的根基并不是想象中的牢固阿。

    注:本文參考了Thinking in Java》,這本書真需要細細品味啊!





    posted on 2007-05-21 22:34 kafka0102 閱讀(3180) 評論(2)  編輯  收藏 所屬分類: J2SE

    評論

    # re: 上溯造型和下溯造型 2007-05-22 09:07 自己的小屋
    這里是upcasting和downcasting...它應該是繼承的一些特征。設計模式中就瘋狂得用到這些東西。比如說還有:多態等。  回復  更多評論
      

    # re: 上溯造型和下溯造型 2007-05-22 23:52 熱門單曲
    多謝樓主分享 頂了  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 精品日韩99亚洲的在线发布| 国产美女无遮挡免费视频网站| 免费无码黄网站在线看| 一级做a免费视频观看网站| 思思久久99热免费精品6| 深夜福利在线免费观看| 国产精品亚洲va在线观看| 日本亚洲欧美色视频在线播放| 亚洲6080yy久久无码产自国产| 亚洲国产精品网站在线播放| 亚洲AV永久无码天堂影院| 亚洲AV无码片一区二区三区 | 91情侣在线精品国产免费| 99久久这里只精品国产免费| 大地资源在线观看免费高清| 天天操夜夜操免费视频| 啊v在线免费观看| 最新亚洲成av人免费看| 亚洲VA中文字幕不卡无码| 亚洲综合激情视频| 国产精品高清视亚洲一区二区| 亚洲精品精华液一区二区| 日本免费精品一区二区三区 | 亚洲精品视频在线观看免费| 亚洲人成网站在线观看播放青青| 亚洲成a人片在线看| 日本亚洲中午字幕乱码 | 亚洲av无码专区在线| 亚洲色大成网站www永久男同| 小说区亚洲自拍另类| 91视频精品全国免费观看| **aaaaa毛片免费| 日韩视频免费在线| 不卡一卡二卡三亚洲| 亚洲毛片一级带毛片基地| 亚洲国产欧美日韩精品一区二区三区| 一级毛片视频免费| 亚洲成人免费在线观看| 国产yw855.c免费视频| 久久综合日韩亚洲精品色| 亚洲人成综合网站7777香蕉|