DANCE WITH JAVA

          開發(fā)出高質量的系統(tǒng)

          常用鏈接

          統(tǒng)計

          積分與排名

          好友之家

          最新評論

          對(重載overloading和覆寫overriding哪個更早執(zhí)行-- visitor幫助篇)這篇文章的說明

          有興趣的話可以看看這篇文章,下邊gg_shily朋友和我的一些討論,在gg_shily的激發(fā)下,我決定仔細研究一下這個問題,在我的很多文章中都用過的字節(jié)碼,我想在這里也能幫助我 。下邊是分析的結果,為了方便觀看,我把里邊的兩個類稍微變動一下
          ?1package?ov;
          ?2
          ?3public?class?Child?extends?Parent?{
          ?4
          ?5????public?void?run(Object?o)?{
          ?6????????System.out.println("?in?Child?+param:Object?");
          ?7????}

          ?8
          ?9????public?void?run(String?str)?{
          10????????System.out.println("?in?Child?+?param:String?");
          11????}

          12
          13????public?static?void?main(String[]?args)?{
          14????????
          15????????String?str?=?new?String();
          16????????Parent?p?=?new?Child();
          17????????test(p,str);
          18????}

          19????public?static?void?test(Parent?p,String?str){
          20????????p.run(str);
          21????}

          22}
          然后編譯,反編譯得到字節(jié)碼如下:(得到字節(jié)碼的方法見這里
          public?class?ov.Child?extends?ov.Parent{
          public?ov.Child();
          ??Code:
          ???
          0:???aload_0
          ???
          1:???invokespecial???#8;?//Method?ov/Parent."<init>":()V
          ???4:???return

          public?void?run(java.lang.Object);
          ??Code:
          ???
          0:???getstatic???????#16;?//Field?java/lang/System.out:Ljava/io/PrintStream;
          ???3:???ldc?????#22;?//String??in?Child?+param:Object
          ???5:???invokevirtual???#24;?//Method?java/io/PrintStream.println:(Ljava/lang/St
          ring;)V
          ???
          8:???return

          public?void?run(java.lang.String);
          ??Code:
          ???
          0:???getstatic???????#16;?//Field?java/lang/System.out:Ljava/io/PrintStream;
          ???3:???ldc?????#32;?//String??in?Child?+?param:String
          ???5:???invokevirtual???#24;?//Method?java/io/PrintStream.println:(Ljava/lang/St
          ring;)V
          ???
          8:???return

          public?static?void?main(java.lang.String[]);
          ??Code:
          ???
          0:???new?????#38;?//class?java/lang/String
          ???3:???dup
          ???
          4:???invokespecial???#40;?//Method?java/lang/String."<init>":()V
          ???7:???astore_1
          ???
          8:???new?????#1;?//class?ov/Child
          ???11:??dup
          ???
          12:??invokespecial???#41;?//Method?"<init>":()V
          ???15:??astore_2
          ???
          16:??aload_2
          ???
          17:??aload_1
          ???
          18:??invokestatic????#42;?//Method?test:(Lov/Parent;Ljava/lang/String;)V
          ???21:??return

          public?static?void?test(ov.Parent,?java.lang.String);
          ??Code:
          ???
          0:???aload_0
          ???
          1:???aload_1
          ???
          2:???invokevirtual???#50;?//Method?ov/Parent.run:(Ljava/lang/String;)V
          ???5:???return

          }
          可以看到調用的是Parent.run(String)這樣說明在編譯期間,因為重載就決定了Parent.run(String)
          然后到運行期,會向下轉型到Child.run(String)

          posted on 2006-12-20 00:32 dreamstone 閱讀(2609) 評論(3)  編輯  收藏 所屬分類: jdk相關

          評論

          # re: 對(重載overloading和覆寫overriding哪個更早執(zhí)行-- visitor幫助篇)這篇文章的說明 2006-12-20 20:43 gg_shily

          不好意思,我白天用不了msn,周末的時候才能用,我的msn是GG_sHiLy@hotmail.com,加你了,你這么說我覺得就很明白了,呵呵  回復  更多評論   

          # re: 對(重載overloading和覆寫overriding哪個更早執(zhí)行-- visitor幫助篇)這篇文章的說明 2007-02-18 01:39 喜來了

          對Java中, 怎樣從一個方法調用instance.foo(args) ,找到實際調用的函數(shù), 在Core Java里有很詳細的描述, 簡單講, 每個Class會保存一個方法調用表, 根據(jù)instance的具體值和方法的signature尋找。 順帶的, Core Java里還詳細講述了Java Compiler和Java解釋器是怎樣從一個類名找到一個具體的類文件位置。

          其實所謂的Polymorphy也好, Overloading也好都是對Java Compiler和解釋器內部算法的抽象。如果有人需要Core Java的電子書,我這有,發(fā)封信給我。也可以從這個站上下http://www.aygfsteel.com/xilaile/archive/2007/02/16/100022.aspx
          很多關于計算機的書  回復  更多評論   

          # re: 對(重載overloading和覆寫overriding哪個更早執(zhí)行-- visitor幫助篇)這篇文章的說明 2007-06-21 13:18 s

          我要Core Java的電子書謝謝 shangcom2006@163.com  回復  更多評論   

          主站蜘蛛池模板: 清新县| 德兴市| 兖州市| 泰和县| 福安市| 曲沃县| 行唐县| 陕西省| 闵行区| 稻城县| 深泽县| 九江市| 巧家县| 新河县| 鄂托克旗| 桂东县| 壤塘县| 伊宁市| 保德县| 连江县| 彭泽县| 额尔古纳市| 商洛市| 金川县| 贵州省| 溆浦县| 泗阳县| 阿荣旗| 余庆县| 孟津县| 龙口市| 星座| 德江县| 政和县| 雷山县| 章丘市| 广汉市| 九台市| 云霄县| 华宁县| 丽江市|