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

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

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

    JUST DO IT ~

    我只想當個程序員

    一個 Generic問題

    一個 Generic問題?
    來自 http://blog.csdn.net/zhangxiaoxiang/archive/2006/11/07/1372076.aspx?Pending=true

    下面程序的main方法中的第二行代碼和注釋中的兩行代碼表達的意思完全相同,注釋中的兩行代碼不能通過編譯(這很容易理解),而第二行(采用方法調用鏈)卻可以順利通過編譯(這就很難理解了)。

    public ? class ?Test
    {
    ????
    public ? void ?func()
    ????
    {
    ?????????System.out.println(
    " func " );
    ???}

    ?
    ???
    public ? static ? void ?main(String?args[])? throws ?Exception
    ???
    {
    ???????????Object?obj?
    = ? new ?Test();

    ???????????
    // 下面這行可以成功編譯??
    ???????????((Test)obj).getClass().newInstance().func();

    ???????????
    // 下面這兩行無法通過編譯
    ??????????? /* Class?c?=?((Test)obj).getClass();
    ???????????c.newInstance().func();?
    */

    ???
    ?}

    }
    ?


    我把這段程序調試了一下


    public?class?Test
    {
    ????
    public?void?func()
    ????
    {
    ?????????System.out.println(
    "func");
    ???}

    ?
    ???
    public?static?void?main(String?args[])?throws?Exception
    ???
    {
    ???????????Object?obj?
    =?new?Test();

    ???????????
    //下面這行可以成功編譯??
    ???????????((Test)obj).getClass().newInstance().func();

    ???????????
    //下面這兩行無法通過編譯
    ???????????
    ???????????
    ???????????
    //下面這兩行無法通過編譯
    ???????????/*Class?c?=?((Test)obj).getClass();
    ???????????c.newInstance().func();?
    */


    ???????????
    ?????????Class?
    <???extends?Test>?c?=?((Test)obj).getClass();
    ?????????
    //因為Generic,?編譯器可以在編譯期獲得類型信息所以可以編譯這類代碼。你將下面那兩行改成?

    ???????????c.newInstance().func();?
    ???
    ?}

    }
    ?







    下面的代碼
    ?? Object obj = new Test();

    ???? //下面這行可以成功編譯??
    ??? ((Test)obj).getClass().newInstance().func();


    javap之后

    public static void main(java.lang.String[])?? throws java.lang.Exception;
    ? Code:
    ?? 0:?? new???? #5; //class Test
    ?? 3:?? dup
    ?? 4:?? invokespecial?? #6; //Method "<init>":()V
    ?? 7:?? astore_1
    ?? 8:?? aload_1
    ?? 9:?? checkcast?????? #5; //class Test
    ?? 12:? invokevirtual?? #7; //Method java/lang/Object.getClass:()Ljava/lang/Class;
    ?? 15:? invokevirtual?? #8; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
    ?? 18:? checkcast?????? #5; //class Test
    ?? 21:? invokevirtual?? #9; //Method func:()V
    ?? 24:? return

    }
    ???

    ??? ((Test)c.newInstance()).func();


    ?? 52:? invokevirtual?? #16; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
    ?? 55:? checkcast?????? #5; //class Test



    virtualf?發表于2006-11-08 14:19:00??IP: 222.209.220.*

    這是編譯器行為.

    ((Test)obj).getClass().newInstance().func();

    <=>

    ((Test)(obj.getClass().newInstance())).func();


    可以反編譯后查看.

    //的確如此。




    ???? Object obj = new Test();
    ???? Class < ? extends Test> c = ((Test)obj).getClass();
    ?????? c.newInstance().func();

    ??
    ??
    ?? 9:?? checkcast?????? #5; //class Test
    ?? 12:? invokevirtual?? #7; //Method java/lang/Object.getClass:()Ljava/lang/Class;
    ?? 15:? astore_2
    ?? 16:? aload_2
    ?? 17:? invokevirtual?? #8; //Method java/lang/Class.newInstance:()Ljava/lang/Object;
    ?? 20:? checkcast?????? #5; //class Test
    ?? 23:? invokevirtual?? #9; //Method func:()V
    ?? 26:? return

    }

    ? Class < ? extends Test> c = ((Test)obj).getClass();
    ? System.out.println();?
    ? Test? ff=? c.newInstance();//.func();

    就無需轉換?.直接拿到對象了.

    ?

    getClass

    public final Class<? extends Object> getClass()






    當系統認為 class 變量 < 來自那個類的class >
    通過 class 變量.newInstance; 被賦予了 那個類的類型.

    posted on 2006-11-08 16:16 小高 閱讀(272) 評論(0)  編輯  收藏 所屬分類: java基礎

    導航

    <2006年11月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(352)

    收藏夾(19)

    關注的blog

    手冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一本久久A久久免费精品不卡| 国产亚洲精品成人久久网站| 无码人妻一区二区三区免费看| 在线日韩日本国产亚洲| g0g0人体全免费高清大胆视频| 亚洲国产天堂久久综合| 美女露隐私全部免费直播| 四虎影院永久免费观看| 手机永久免费的AV在线电影网| 亚洲AV网站在线观看| 一级看片免费视频| 亚洲香蕉网久久综合影视| 国产婷婷成人久久Av免费高清 | 亚洲中文字幕无码中文字在线 | 精品国产日韩亚洲一区在线| 亚洲国产成人久久一区WWW| 一级特黄特色的免费大片视频| 久久影视国产亚洲| 性无码免费一区二区三区在线| 亚洲福利视频一区二区三区| 成年轻人网站色免费看| 免费无码一区二区| 亚洲VA中文字幕无码一二三区 | 四虎永久在线精品免费网址 | 亚洲Av无码国产情品久久| 国产裸体美女永久免费无遮挡| 亚洲精品无码不卡在线播放HE| 蜜桃AV无码免费看永久| 男人天堂免费视频| 久久精品蜜芽亚洲国产AV| 免费毛片在线看片免费丝瓜视频| 深夜A级毛片视频免费| 亚洲av无码潮喷在线观看| 在线视频观看免费视频18| 黄色免费网址大全| 亚洲一区二区成人| 国产自产拍精品视频免费看| 手机看片国产免费永久| 亚洲AV无码一区二区三区性色 | 亚洲国色天香视频| 亚洲AV无码乱码在线观看|