DANCE WITH JAVA

          開發出高質量的系統

          導航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          隨筆分類(277)

          隨筆檔案(238)

          閱讀排行榜

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          重載overloading和覆寫overriding哪個更早起作用-- visitor幫助篇

          接受建議,改一下標題.例子不太恰當,我刪除了。換成了回文中的例子。
          重載overloading和覆寫overriding哪個更早執行--?? visitor幫助篇
          一:問題提出
          雖然我們經常寫程序用到重載和覆寫,但是很少會考慮他們的執行順序。下邊的內容就是關于,他們同時出現時
          哪個先起作用:
          二:問題分析
          Java是"動態單分派靜態多分派語言",這個定義已經多次提起,如果你不了解這些概念,看這里"visitor模式準備"
          所以就注定了重載(靜態多分派)要早于覆寫(動態單分派),因為靜態分派是編繹期實現的,動態分派是執行期實現的。
          三:驗證
          見這里

          最后的部分:

          看完本文,如果你對visitor模式有更多的興趣,想了解更多請看如下幾篇文章。
          1,靜態分派,動態分派,多分派,單分派 --------------?? visitor模式準備
          2,訪問差異類型的集合類 ------------------------?? visitor模式入門
          3,visitor模式理論及學術概念-------------------?? visitor模式進一步
          4,重載overloading和覆寫overriding哪個更早執行--?? visitor幫助篇 (本文)
          雖然排列順序是1,2,3,4但是我個人建議的學習方式是2,1,3,4因為這個順序更方便一般人理解

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

          評論

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 15:42 云靜心舞

          .....字這么大....  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 18:11 圣川

          我感覺不是這樣的
          因為你是這樣定義的
          Parent p = new Child();

          這樣p其實并不知道它的子類有個 run(String)方法,這種現象在繼承中叫切割現象,所以p會調用自己的run(Object)方法,之所以會是子類的結果是因為這個時候發生了一個向下轉型而已。如果你換成Child p = new Child()就是另一個結果了。
            回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 21:59 dreamstone

          to 圣川:
          如果是Child p = new Child()就沒有區別了,因為這樣無論怎么執行結果是一樣的。
          不過仔細想想我的例子可能并不恰當,例子展示的好像是向下轉型和重載哪個發生更早些。不過這個說法應該是對的,因為重載是編譯器確定的.  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 22:04 gg_shily

          @圣川
          對,Parent p = new Child(); 這樣定義以后,p只能調用Parent的run方法和Child overriding 后的run方法,你如果調用Child overloading后的方法必須要向下轉型,也就是說你的Parent類里如果沒有run(Object)這個方法,你的這條語句:p.run(str); 也是不能調用的
            回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 22:11 gg_shily

          我覺得重載和重構本身就是兩個不相干的事情,不會存在那個更早執行的問題,因為他們兩個是不會重復的,你的方法要么是重載要么是重構,怎么會有個方法既是重寫又是重構呢?舉個例子先  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 22:44 dreamstone

          to gg_shily :
          現在想來我的例子可能有些問題,但是重載和覆寫還是可以同時出現的:
          class Parent {
          public void run(Object o) {
          System.out.println(" in Parent +param:object ");
          }

          public void run(String str) {
          System.out.println(" in Parent + param:int ");
          }
          }

          class Child extends Parent {

          public void run(Object o) {
          System.out.println(" in Child +param:Object ");
          }

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

          public static void main(String[] args) {
          Parent p = new Child();
          String str = new String();
          p.run(str);
          }
          }
          下邊這種情況in Child + param:String 打印出來,必定是經歷了一次重載和一次向下轉型,沒有向下轉型Parent不可能變成child,無論是在父類還是子類的兩個函數中選擇必定就是重載,所以重復出現是可能的。
          只是這樣就體現不出來執行順序了,所以我改了一個版本出來,現在向來但是的更改有寫欠考慮。但是這個問題肯定是存在的。
            回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 23:01 gg_shily

          我覺得你的這兩個方法都是對父類方法的overriding 而不是overloading 所以程序發生了多態效應,run(String)方法通過動態邦定運行的是子類的方法,而沒有經歷重載  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-19 23:05 gg_shily

          有時間可以直接交流一下,我的qq:30622882 我晚上一般在但都是隱身  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 00:09 dreamstone

          對啊,是對父類的overriding,但是到了子類后就需要overloading了。
          所以你認為是先向下轉型,然后在子類內overloading ?

          我很少用qq,給你發郵件了,看看收到沒,我發到gg_shily(AT)163.com了。  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 00:38 dreamstone

          另外我又從另一個角度看了一下,你看看這個文章:
          http://www.aygfsteel.com/dreamstone/archive/2006/12/20/88942.html  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 10:28 daydream

          覺得overload和override是不同的兩回事,不存在哪個先執行的問題。

          overload是在編譯期間根據變量的聲明類型,在聲明類型中尋找最匹配的方法原型,
          Parent p = new Child();
          p.run("...");
          在編譯期間會在Parent類中尋找一個最匹配的方法原型(方法簽名),

          然后運行期間,因為run方法在Parent類中不是靜態的、也不是final的(java中的方法默認是override的),所以,會再根據實際的對象類型,查找從實際類型到Parent類型之間、所有重寫了同一個方法簽名的所有方法(這兒查找的是相同的方法簽名),如果找到了,就執行子類的方法。  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 10:32 daydream

          補充一下,就是說,overload和override是兩個階段的概念。
          在編譯期沒有override的概念,同樣,在運行期,也沒有overload的概念。  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 10:49 wolfsquare

          在每個類中,所有的方法入口偏移編譯后都是已確定的,
          所以無論你如何overload和overwrite,它的執行順序也必是確定的,也就是說
          public static void test(Parent p,String str){
          p.run(str);
          }編譯時,已經知道了會最終調run(Object o) 還是run(String str),但這時候還不知道是哪個類的,當有overwrite的方法時,會轉向overwrite的方法.
          綜上所述,如果是問執行順序的話,LZ的問題就沒有意義.
          如果是問誰先確定,則是overload  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 14:30 mu!!

          這里面是兩個問題
          1,繼承中的切割現象。
          樓上的兄弟也說了
          就是說子類中的Overload函數,通過父類的對象是調不到的。
          Parent p = new Child();
          定義后,p不可能直接調到Child中比Parent多出來的任何方法。

          2,僅僅參數類型不同,而且是類型不同是發生在基類和子類之間的Overload的函數如何被調用。
          這里的原則就是傳什么,調什么。
          比如
          Child p = new Child();
          p.run(str); ->出String
          p.run((Object)str); ->出Object

          說到底,Override和多態通過虛函數表實現。
          Overload通過Name-Marshalling實現。

          另外,我不是很確定,但你的Vistor好像理解得有點問題。
            回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 14:34 mu!!

          樓上的樓上的說得很好,
          編譯完之后,只剩下一個多態的問題了。
          重載在編譯完成就沒什么不確定的了。  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 15:39 dreamstone

          to daydream :
          覺得overload和override是不同的兩回事,不存在哪個先執行的問題。
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          我并沒有說兩個是一會事,我只是說這兩個的發生順序不同。一個發生在編譯器,一個發生在執行期。這個是我文章 一開始就說的。不過可能我的用詞不太恰當。
          應該是說哪個最先發生  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 15:51 dreamstone

          to wolfsquare :
          在文章一開始我就說了:
          所以就注定了重載(靜態多分派)要早于覆寫(動態單分派),因為靜態分派是編繹期實現的,動態分派是執行期實現的。

          所以我們說的是一會事,不過我的文章題目有問題,應該改成哪個先起作用,或者先確定。謝謝指正。

          另外其實很多東西有專業的術語,我可以直接引用,這樣可以保正確切,并且不出問題,但是這些專業的術語經常會造成懂的人懂,不懂的人還是不懂,所以我想盡量用一些簡單的平常的話來描述,這是我開始的想法,所以我的所有文章看起來并不是那么簡練。在過程中經常會因為考慮不當,犯些錯誤,讓人誤解,甚至誤導別人,所以謝謝你的指正,我會在有時間的時候修正這些錯誤。  回復  更多評論   

          # re: 重載overloading和覆寫overriding哪個更早執行-- visitor幫助篇 2006-12-20 15:55 dreamstone

          to mu!! :
          我不知道你說的,我對Vistor好像理解得有點問題。 是指什么地方,
          我這篇文章是為了在使用visitor模式中長出現的一些問題或者名詞做個說明,并不是講的visitor模式。
          如果你認為我對visitor模式的理解有問題的話,麻煩說明什么地方有問題?

          另外你所說的切割現象是沒問題的,我也知到,但是我們說的不是同一個東西。

            回復  更多評論   

          主站蜘蛛池模板: 万荣县| 姚安县| 多伦县| 平昌县| 句容市| 白山市| 灯塔市| 荆门市| 清原| 定远县| 上栗县| 会东县| 萨迦县| 兰坪| 当涂县| 蒙城县| 伊金霍洛旗| 陇川县| 莎车县| 新民市| 三明市| 财经| 连州市| 海南省| 东台市| 盱眙县| 马公市| 兴国县| 花莲县| 金乡县| 商南县| 闽侯县| 吴川市| 滨海县| 鹤庆县| 浪卡子县| 连江县| 嘉峪关市| 岑溪市| 资阳市| 万州区|