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

 

     }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值