• <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
            多態 (Polymorphism) 大家應該都不陌生,它是我們開發面向對象系統的“老朋友”了 。但是老朋友也會有“煩心”的時候啊,呵呵。有時候不注意,還真會被它難到。譬如下面這個例子(thank Hayden)。大家可以先不看下面的答案,在自己腦海中運行一道,看看自己想的跟實際結果是否相符。
            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......");
             }
            }
            下面是它的運行結果:
            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......

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

            posted on 2011-04-08 18:35 luis 閱讀(346) 評論(0)  編輯 收藏 引用 所屬分類: Java筆記
            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品成人99久久久久 | 久久精品国产福利国产秒| 久久久免费精品re6| 国产精品永久久久久久久久久| 亚洲国产成人乱码精品女人久久久不卡| 蜜臀久久99精品久久久久久| 色88久久久久高潮综合影院| 国产成人精品久久综合| 国产成人无码久久久精品一| 麻豆久久久9性大片| 99久久婷婷国产一区二区| 少妇久久久久久被弄高潮| 亚洲成av人片不卡无码久久| 亚洲国产精品人久久| 日韩人妻无码精品久久久不卡| 人人狠狠综合久久亚洲高清| 久久精品成人国产午夜| 久久久久亚洲AV无码网站| 97精品伊人久久大香线蕉| 午夜精品久久久内射近拍高清| 久久青草国产手机看片福利盒子| 伊人久久大香线蕉av不卡| 亚洲AⅤ优女AV综合久久久| 久久精品国产99久久香蕉| 一本一道久久精品综合| 国产精品一区二区久久不卡| 亚洲va久久久噜噜噜久久男同 | 久久国内免费视频| 久久一区二区三区免费| 久久精品国产99久久丝袜| 久久久精品久久久久久| 精品无码久久久久久久久久| 国产精品一区二区久久精品无码 | 久久婷婷五月综合97色直播| 久久91精品国产91| 亚洲午夜精品久久久久久浪潮| 欧美日韩精品久久久久| 亚洲精品tv久久久久| 亚洲天堂久久久| 人妻无码αv中文字幕久久| 国产欧美久久久精品|