静态分派与动态分派

静态分派

       先看定义:所有依赖静态类型来定位方法执行版本的分派动作成为静态分派。

      静态分派典型的应用方法重载

你能看出下面代码的输出什么吗????????????

class Dog{}
class WhiteDog extends Dog{}
class BlackDog extends Dog{}
public class Person {
    public void feed(Dog dog){
        System.out.println("feed Dog");
    }
    public void feed(WhiteDog Dog){
        System.out.println("feed WhiteDog");
    }
    public void feed(BlackDog Dog){
        System.out.println("feed BlackDog");
    }
    public static void main(String[] args) {
        Dog wd = new WhiteDog();
        Dog bd = new BlackDog();
        Person p = new Person();
        p.feed(wd);
        p.feed(bd);
    }

}

输出:

feed dog
feed dog

      这个结果可能会让很多人大跌眼镜,这样的结果是因为重载是静态分派,在编译器执行的,取决于变量的声明类型,说白了就是在编译时feed()方法中的参数都是Dog类型的,所以最后的只会调用第一个重载方法。


动态分派

   还是先看定义:发生在运行期,动态分派,动态的置换掉某个方法。

   它和多态性的另外一个重要体现——重写 有着很密切的关系。

还是用上面的例子:

class Dog{
    public void eat(){
        System.out.println("Dog eat");
    }
}
public class BlackDog extends Dog{
    public void eat(){
        System.out.println("black Dog eat");
    }
    public static void main(String[] args){
        Dog Dog = new BlackDog();
        Dog.eat();
    }
}

输出:

black Dog eat

这个结果并不出人意料,对于习惯了面向对象思维的Java程序员会觉得完全是理所当然的。这样的结果是因为在执行期发生了向下转型,就是动态分派了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值