静态分派 :
以下是静态分派的测试代码
public class StaticDispatch {
static abstract class Human{}
static class Man extends Human{}
static class Woman extends Human{}
public static void say(Human human){
System.out.println("Human");
}
public static void say(Man man){
System.out.println("Man");
}
public static void say(Woman woman){
System.out.println("Woman");
}
public static void main(String []args){
Human h = new Man();
Human h2 = new Woman();
say(h);//输出Human
say(h2);//输出Human
say((Man)h);//输出Man
}
}
我们把上面代码中的“Human”称为变量的静态类型(Static Type),或者叫做的外观类型 (Apparent Type),后面的“Man”则称为变量的实际类型(Actual Type),静态类型和实际类型在程序中都可以发生一些变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会被改变,并且最终的静态类型是在编译期可知的;而实际类型变化的结果在运行期才可确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。
动态分派(运行期根据实际类型确定方法执行版本的 分派过程):
public class DynamicDispatch {
static abstract class Human{
protected abstract void sayHello();
}
static class Man extends Human{
@Override
protected void sayHello(){
System.out.println("man say hello");
}
}
static class Woman extends Human{
@Override
protected void sayHello(){
System.out.println("woman say hello");
}
}
public static void main(String[]args){
Human man=new Man();
Human woman=new Woman();
man.sayHello();//输出man say hello
woman.sayHello();//输出woman say hello
man=new Woman();
man.sayHello();//输出woman say hello
}
}