• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0
            多態(tài) (Polymorphism) 大家應(yīng)該都不陌生,它是我們開發(fā)面向?qū)ο笙到y(tǒng)的“老朋友”了 。但是老朋友也會(huì)有“煩心”的時(shí)候啊,呵呵。有時(shí)候不注意,還真會(huì)被它難到。譬如下面這個(gè)例子(thank Hayden)。大家可以先不看下面的答案,在自己腦海中運(yùn)行一道,看看自己想的跟實(shí)際結(jié)果是否相符。
            public class Polymorphism{
             public static void main(String[] args) {
              A b = new B();
              b.fb();
             }
            }
            class A {
             public A(){
              
             }
             public void fa() {
              System.out.println("CLASS A :Function fa Runing......");
             }

             public void fb() {
              System.out.println("CLASS A :Function fb Runing......");
              fa();
              System.out.println("CLASS A :Function fb Stop......");
             }
            }
            class B extends A {
             public B(){
             }
             public void fa() {
              System.out.println("CLASS B :Function fa Runing......");
             }

             public void fb() {
              System.out.println("CLASS B :Function fb Runing......");
              super.fb();
              System.out.println("CLASS B :Function fb Stop......");
             }
            }
            下面是它的運(yùn)行結(jié)果:
            CLASS B :Function fb Runing......
            CLASS A :Function fb Runing......
            CLASS B :Function fa Runing......
            CLASS A :Function fb Stop......
            CLASS B :Function fb Stop......

               怎么樣,猜對(duì)結(jié)果了嗎?如果結(jié)果跟你想象的一模一樣,那么恭喜你,你對(duì)多態(tài)已經(jīng)有初步了解了,起碼在語法層次上是比較熟悉了。但是,千萬不要“洋洋得意”,你可否解析結(jié)果為什么會(huì)是這樣嗎?我們可以先來梳理一下程序流程:
               1、運(yùn)行main函數(shù),創(chuàng)建B對(duì)象(A b = new B(),完全可以替代B b=new B();),調(diào)用B的方法fb,于是打印出"CLASS B :Function fb Runing......",都在情理之中。
               2、執(zhí)行super.fb(),調(diào)用父類A的方法fb,首先打印出"CLASS A :Function fb Runing......",預(yù)料之中
               3、執(zhí)行方法fa(),打印出"CLASS B :Function fa Runing......",呃?奇怪了,為什么不是執(zhí)行A的方法fa(),而是子類B中的fa()呢?當(dāng)前被執(zhí)行的是類A的方法,那么虛擬機(jī)找到的應(yīng)該是A類的Method Table,找到的應(yīng)該是A類的方法fa()啊?難解~
               4、打印"CLASS A :Function fb Stop......",返回
               5、打印"CLASS A :Function fb Stop.....",返回,程序結(jié)束。
              現(xiàn)在問題清楚了,就是虛擬機(jī)在執(zhí)行類A方法的時(shí)候查找的Method Table竟然是子類B的。為什么呢?其實(shí),只要我們清楚java方法調(diào)用的方式,這個(gè)問題就迎刃而解了。在Java虛擬機(jī)中,每啟動(dòng)一個(gè)新的線程,虛擬機(jī)都會(huì)為它分配一個(gè)Java棧,而每當(dāng)線程調(diào)用一個(gè)java方法時(shí),虛擬機(jī)就會(huì)在該線程的java棧中壓入一個(gè)新幀,用以存儲(chǔ)參數(shù),局部變量等數(shù)據(jù)。我們將這個(gè)正在被執(zhí)行的方法稱為該線程的當(dāng)前方法,其相應(yīng)的棧幀為當(dāng)前幀。
                好了,當(dāng)我們調(diào)用一個(gè)方法時(shí),我們需要往當(dāng)前幀中壓入哪些參數(shù)呢?簡(jiǎn)單,方法的參數(shù)列表中不是都說得清清楚楚的嗎?嗯,對(duì)于C語言來說,這個(gè)說法是正確的,但是對(duì)于諸如C++,Java,Python等面向?qū)ο笳Z言來說,卻是不對(duì)的。大家還記得那個(gè)"this"指針嗎?!不錯(cuò),在Java中,所有的實(shí)例方法(Instance Method)調(diào)用的時(shí)候都會(huì)把當(dāng)前對(duì)象壓入當(dāng)前幀中,Java虛擬機(jī)正是通過這個(gè)參數(shù)來決定當(dāng)前所使用的類(通過判斷該對(duì)象的類型)
                在上面的例子中,main中調(diào)用b.fb()時(shí),壓入的當(dāng)前對(duì)象自然是B類對(duì)象,我們記為b。在B的fb()中調(diào)用super.fb()時(shí),壓入的就是剛剛壓入的對(duì)象,也就是b了。同樣,在A的fb中調(diào)用fa()時(shí),壓入的也是b。因此,在使用 invokevirtual指令調(diào)用fa()時(shí),找的就是B的方法表(當(dāng)前對(duì)象b的類型為B),也就執(zhí)行了類B的fa了。
                這種現(xiàn)象在構(gòu)造函數(shù)中特別常見,因?yàn)闃?gòu)造函數(shù)中會(huì)隱含使用調(diào)用父類的構(gòu)造函數(shù)的,如果在父類的構(gòu)造函數(shù)中調(diào)用了實(shí)例方法(如 A的fa),而在子類中又覆蓋了這個(gè)實(shí)例方法(如 B的fa),那么得到的結(jié)果往往不是我們所要的。因此,我們最好不要在構(gòu)造函數(shù)中使用多態(tài)方法,不然,Debug會(huì)很痛苦的:)

            posted on 2011-04-08 18:35 luis 閱讀(338) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Java筆記
            <2010年1月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            无码任你躁久久久久久| 久久狠狠一本精品综合网| 久久综合精品国产一区二区三区| 香蕉久久一区二区不卡无毒影院 | 精品久久久无码人妻中文字幕豆芽| 久久精品国产亚洲AV久| 色综合久久久久无码专区| 国内精品久久久久伊人av| 久久青青草原综合伊人| 久久久久无码中| 伊人久久大香线蕉亚洲| 97久久天天综合色天天综合色hd| 99久久无码一区人妻| 亚洲国产视频久久| 国产精品久久久久天天影视| 色99久久久久高潮综合影院 | 久久发布国产伦子伦精品| 国产69精品久久久久99| 精品久久久久久中文字幕大豆网| 69国产成人综合久久精品| 伊人热热久久原色播放www| 日韩久久久久久中文人妻| 亚洲国产二区三区久久| 久久综合亚洲鲁鲁五月天| 久久精品国产只有精品2020| 武侠古典久久婷婷狼人伊人| 久久这里只有精品18| 久久久久久青草大香综合精品| 人妻精品久久无码专区精东影业 | www.久久99| 偷窥少妇久久久久久久久| 99久久精品国产毛片| 久久久一本精品99久久精品88| 亚洲精品成人久久久| 久久久久国产一级毛片高清板| 97久久久久人妻精品专区| 亚洲AV无码久久精品成人| 久久天天婷婷五月俺也去| 久久国产高清一区二区三区| 久久福利青草精品资源站免费| 亚洲国产精品18久久久久久|