DANCE WITH JAVA

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

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          好友之家

          最新評(píng)論

          對(duì)(重載overloading和覆寫(xiě)overriding哪個(gè)更早執(zhí)行-- visitor幫助篇)這篇文章的說(shuō)明

          有興趣的話可以看看這篇文章,下邊gg_shily朋友和我的一些討論,在gg_shily的激發(fā)下,我決定仔細(xì)研究一下這個(gè)問(wèn)題,在我的很多文章中都用過(guò)的字節(jié)碼,我想在這里也能幫助我 。下邊是分析的結(jié)果,為了方便觀看,我把里邊的兩個(gè)類(lèi)稍微變動(dòng)一下
          ?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é)碼的方法見(jiàn)這里
          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

          }
          可以看到調(diào)用的是Parent.run(String)這樣說(shuō)明在編譯期間,因?yàn)橹剌d就決定了Parent.run(String)
          然后到運(yùn)行期,會(huì)向下轉(zhuǎn)型到Child.run(String)

          posted on 2006-12-20 00:32 dreamstone 閱讀(2612) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): jdk相關(guān)

          評(píng)論

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

          不好意思,我白天用不了msn,周末的時(shí)候才能用,我的msn是GG_sHiLy@hotmail.com,加你了,你這么說(shuō)我覺(jué)得就很明白了,呵呵  回復(fù)  更多評(píng)論   

          # re: 對(duì)(重載overloading和覆寫(xiě)overriding哪個(gè)更早執(zhí)行-- visitor幫助篇)這篇文章的說(shuō)明 2007-02-18 01:39 喜來(lái)了

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

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

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

          我要Core Java的電子書(shū)謝謝 shangcom2006@163.com  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 宕昌县| 鄂温| 大庆市| 凤山县| 鄄城县| 芦溪县| 南皮县| 拉孜县| 大渡口区| 泰来县| 汝阳县| 青川县| 阿拉善盟| 萝北县| 沭阳县| 金湖县| 鹰潭市| 江西省| 衡东县| 津市市| 奉新县| 武邑县| 视频| 惠来县| 诸暨市| 和政县| 云和县| 青龙| 石台县| 江城| 梅州市| 扬中市| 高州市| 航空| 沂源县| 江永县| 习水县| 尉犁县| 玛多县| 宝应县| 明溪县|