Java語言靜態多分派 與 動態單分派

publicclass Cat {

    publicvoid beFeeded(Person p){

       p.feed(this);

    }

}

publicclass WhiteCat extends Cat {

    publicvoid beFeeded(Person p){

       p.feed(this);

    }

}

publicclass BlackCat extends Cat {

    publicvoid beFeeded(Person p){

       p.feed(this);

    }

}

publicclass Person {

    publicvoid feed(Cat cat) {

       System.out.println("Person feedcat");

    }

 

    publicvoid feed(WhiteCat cat) {

       System.out.println("Person feedWhiteCat");

    }

 

    publicvoid feed(BlackCat cat) {

       System.out.println("Person feedBlackCat");

    }

 

}

publicclass Man extends Person {

    publicvoid feed(Cat cat) {

       System.out.println("Man feedcat");

    }

 

    publicvoid feed(WhiteCat cat) {

       System.out.println("Man feedWhiteCat");

    }

 

    publicvoid feed(BlackCat cat) {

       System.out.println("Man feedBlackCat");

    }

 

}

publicclass Woman extends Person {

    publicvoid feed(Cat cat) {

       System.out.println("Woman feedcat");

    }

 

    publicvoid feed(WhiteCat cat) {

       System.out.println("Woman feedWhiteCat");

    }

 

    publicvoid feed(BlackCat cat) {

       System.out.println("Woman feedBlackCat");

    }

}

publicclass Client {

//  一個方法包括三部分:方法的接受者、方法名、方法的參數簽名(包括參數類型、參數個數、參數順序)。

//  其中方法的接受者與方法簽名稱爲方法的宗量

     publicstaticvoid main(String[]args) {

        test1();//說明動態分派

        test2();//說明動態單分派

        test3();//使用反轉球實現兩次動態單分派

        }

     publicstaticvoid test1(){

        Cat cat = new Cat();//可用下面兩條語句替代,對結果無影響

//     Cat cat = new BlackCat();

//     Cat cat = new WhiteCat();

        Person p;

        

        p = new Person();

        p.feed(cat);

        

         p = new Man();

         p.feed(cat);

        

         p = new Woman();

         p.feed(cat);

//       Java語言調用期發生了向下轉型,就是動態分派了。也就是常說的多態

//               運行結果:

//       Person feed cat

//       Man feed cat

//       Woman feed cat

     }

     publicstaticvoid test2(){

        Cat cat = new Cat();

        Cat bc = new BlackCat();

        Cat wc = new WhiteCat();

        

        Person p;

        

        p = new Person();

        p.feed(cat);

        p.feed(bc);

        p.feed(wc);

        

         p = new Man();

         p.feed(cat);

        p.feed(bc);

        p.feed(wc);

        

         p = new Woman();

         p.feed(cat);

        p.feed(bc);

        p.feed(wc);

//       不論參數爲Cat的任何子類型,都不會被考慮,因此Java語言只考慮接受者這個宗量,因此是動態單分派

//               運行結果:

//     Person feed cat

//     Person feed cat

//     Person feed cat

//     Man feed cat

//     Man feed cat

//     Man feed cat

//     Woman feed cat

//     Woman feed cat

//     Woman feed cat

     }

     publicstaticvoid test3(){

        Cat cat = new Cat();

        Cat blackCat = new BlackCat();

        Cat whiteCat = new WhiteCat();

        

        Person p = new Person();

        Person man = new Man();

        Person woman = new Woman();

        

        cat.beFeeded(p);

        blackCat.beFeeded(p);

        whiteCat.beFeeded(p);

        

        cat.beFeeded(man);

        blackCat.beFeeded(man);

        whiteCat.beFeeded(man);

        

        cat.beFeeded(woman);

        blackCat.beFeeded(woman);

        whiteCat.beFeeded(woman);

//       出發兩次動態單分派

//     Person feed cat

//     Person feed BlackCat

//     Person feed WhiteCat

//     Man feed cat

//     Man feed BlackCat

//     Man feed WhiteCat

//     Woman feed cat

//     Woman feed BlackCat

//     Woman feed WhiteCat

 

     }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章