DANCE WITH JAVA

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

          常用鏈接

          統(tǒng)計

          積分與排名

          好友之家

          最新評論

          靜態(tài)分派,動態(tài)分派,多分派,單分派 -------------- visitor模式準備

          一,靜態(tài)分派:
          1,定義:發(fā)生在編譯時期,分派根據(jù)靜態(tài)類型信息發(fā)生,重載就是靜態(tài)分派
          2,什么是靜態(tài)類型:變量被聲明時的類型是靜態(tài)類型
                什么是動態(tài)類型:變量所引用的對象的真實類型
          3,有兩個類,BlackCat ,WhiteCat都繼承自Cat
          如下調用
          class Cat{}
          class WhiteCat extends Cat{}
          class BlackCat extends Cat{}
          public class Person {
              
          public void feed(Cat cat){
                  System.out.println(
          "feed cat");
              }

              
          public void feed(WhiteCat cat){
                  System.out.println(
          "feed WhiteCat");
              }

              
          public void feed(BlackCat cat){
                  System.out.println(
          "feed BlackCat");
              }

              
          public static void main(String[] args) {
                  Cat wc 
          = new WhiteCat();
                  Cat bc 
          = new BlackCat();
                  Person p 
          = new Person();
                  p.feed(wc);
                  p.feed(bc);
              }


          }

          運行結果是:
          feed cat
          feed cat
          這樣的結果是因為重載是靜態(tài)分派,在編譯器執(zhí)行的,取決于變量的聲明類型,因為wc ,bc都是Cat所以調用的都是feed(Cat cat)的函數(shù).
          二,動態(tài)分派
          1,定義:發(fā)生在運行期,動態(tài)分派,動態(tài)的置換掉某個方法。
          還是上邊類似的例子:
          class Cat{
              
          public void eat(){
                  System.out.println(
          "cat eat");
              }

          }

          public class BlackCat extends Cat{
              
          public void eat(){
                  System.out.println(
          "black cat eat");
              }

              
          public static void main(String[] args){
                  Cat cat 
          = new BlackCat();
                  cat.eat();
              }

          }
          這個時候的結果是:
          black cat eat
          這樣的結果是因為在執(zhí)行期發(fā)生了向下轉型,就是動態(tài)分派了。

          三,單分派:
          1,定義:根據(jù)一個宗量的類型進行方法的選擇
          四,多分派:
          1,定義:根據(jù)多于一個宗量的類型對方法的選擇
          2,說明:多分派其實是一系列的單分派組成的,區(qū)別的地方就是這些但分派不能分割。
          3,C++ ,Java都是動態(tài)單分派,靜態(tài)多分派語言
          多分派的語言有:CLOS  Cecil

          最后的部分:

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

          posted on 2006-12-20 01:08 dreamstone 閱讀(5785) 評論(4)  編輯  收藏 所屬分類: jdk相關設計模式

          評論

          # re: 靜態(tài)分派,動態(tài)分派,多分派,單分派 -------------- visitor模式準備 2006-12-20 13:59 mu!!

          單分派:定義:根據(jù)一個宗量的類型進行方法的選擇
          多分派:定義:根據(jù)多于一個宗量的類型對方法的選擇

          宗量???

          對應的英文翻譯是什么?  回復  更多評論   

          # re: 靜態(tài)分派,動態(tài)分派,多分派,單分派 -------------- visitor模式準備 2006-12-20 15:16 dreamstone

          宗量大概的意思是方法的參數(shù)或方法的調用者
          具體的英文確切翻譯不太清楚,下班后找找看
          這一詞的來源是<<Java與模式>>一書,有些其它的講模式的書也使用過。  回復  更多評論   

          # re: 靜態(tài)分派,動態(tài)分派,多分派,單分派 -------------- visitor模式準備[未登錄] 2007-01-17 17:38 h

          樓主,要把概念分清楚,否則會誤導很人,本來是做好事成了誤人子第;
          多分派與多重分派是不一樣的概念,多分派是根據(jù)多與一個宗量的類型對方法進行選擇,而多重分派是一系列單分派組成的分派過程,可以分解成多個單分派的,而多分派是不能分解成多個單分派的.  回復  更多評論   

          # re: 靜態(tài)分派,動態(tài)分派,多分派,單分派 -------------- visitor模式準備[未登錄] 2007-01-19 09:51 dreamstone

          1,根據(jù)多于一個宗量的類型對方法的選擇
          說明:多分派其實是一系列的單分派組成的,區(qū)別的地方就是這些單分派不能分割。

          2,多分派與多重分派是不一樣的概念,多分派是根據(jù)多與一個宗量的類型對方法進行選擇,而多重分派是一系列單分派組成的分派過程,可以分解成多個單分派的,而多分派是不能分解成多個單分派的

          1是我寫的,2是你寫的,沒看到有什么區(qū)別,
          都是根據(jù)多于一個宗量的類型對方法的選擇
          都是多分派是不能分解成多個單分派的

          你強調多重分派的概念,在我看來那是多次單分派,所以我并沒有提出多重分派的概念。

          謝謝你的熱心糾正錯誤,不過麻煩把錯誤明確對比出來。

            回復  更多評論   

          主站蜘蛛池模板: 南通市| 松阳县| 茂名市| 土默特左旗| 乌兰察布市| 左云县| 郑州市| 稷山县| 蛟河市| 社旗县| 辛集市| 山西省| 明光市| 林西县| 奉新县| 东方市| 马龙县| 卓尼县| 深州市| 邯郸县| 乐至县| 黄山市| 四子王旗| 仙居县| 滦南县| 田东县| 安庆市| 祁连县| 勃利县| 道真| 巩义市| 措勤县| 万载县| 龙州县| 平定县| 绍兴县| 马鞍山市| 云龙县| 山丹县| 承德市| 黄山市|