<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方法中的第二行代碼和注釋中的兩行代碼表達的意思完全相同,注釋中的兩行代碼不能通過編譯(這很容易理解),而第二行(采用方法調(diào)用鏈)卻可以順利通過編譯(這就很難理解了)。

    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();?
    */

    ???
    ?}

    }
    ?


    我把這段程序調(diào)試了一下


    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?發(fā)表于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();

    就無需轉(zhuǎn)換?.直接拿到對象了.

    ?

    getClass

    public final Class<? extends Object> getClass()






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

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

    導航

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

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆分類(352)

    收藏夾(19)

    關(guān)注的blog

    手冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字字幕在线高清免费电影| 亚洲色无码国产精品网站可下载| 一级毛片成人免费看a| 女人与禽交视频免费看| 亚洲欧美日韩中文二区 | 免费无码又爽又刺激一高潮| 国产亚洲美女精品久久久| 中文字幕免费人成乱码中国| 亚洲一区精品无码| 精品无码人妻一区二区免费蜜桃| 亚洲色图在线观看| A在线观看免费网站大全| 亚洲欧美中文日韩视频| 国产午夜无码视频免费网站| 久久久久国色AV免费观看| 亚洲gv猛男gv无码男同短文| 99re6免费视频| 亚洲精品无播放器在线播放| 亚洲AⅤ无码一区二区三区在线 | 亚洲一级毛片视频| 青青草国产免费久久久91| 羞羞视频免费网站含羞草| 亚洲人成网7777777国产| 18以下岁毛片在免费播放| 亚洲中文无码mv| 国产亚洲美女精品久久久2020| 久久久久国产免费| 亚洲成AV人影片在线观看| 亚洲无人区一区二区三区| 114一级毛片免费| 香蕉视频免费在线播放| 亚洲AV人无码综合在线观看| 欧美大尺寸SUV免费| 国产免费久久久久久无码| 亚洲剧情在线观看| 亚洲伊人成无码综合网 | 国产亚洲精品免费视频播放| 1000部拍拍拍18勿入免费凤凰福利| 亚洲国产成人无码AV在线影院| 亚洲中文字幕久久精品无码APP| 色片在线免费观看|