静态分派
先看定义:所有依赖静态类型来定位方法执行版本的分派动作成为静态分派。
静态分派典型的应用方法重载
你能看出下面代码的输出什么吗????????????
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程序员会觉得完全是理所当然的。这样的结果是因为在执行期发生了向下转型,就是动态分派了。