动态分派与多态性的另一个重要体现: 重写(Override) 有着十分密切的关系。
一个动态分派的例子:
public class DynamicDispatch {
static abstract class Human
{
protected abstract void say();
}
static class Man extends Human
{
@Override
protected void say()
{
System.out.println("Man");
}
}
static class Woman extends Human
{
@Override
protected void say()
{
System.out.println("Woman");
}
}
public static void main(String[] args) {
Human man=new Man();
Human woman=new Woman();
man.say();
woman.say();
man=new Woman();
man.say();
}
}
执行结果:
显然这里不是采用静态类型来决定的,因为静态类型都是Human的2个变量man和woman调用say()方法执行了不同的版本,原因很明显,2个变量的实际类型不同,Java虚拟机根据将符号引用转成直接引用的过程中产生了不同的解析,而这也是Java语言中重写的本质,这种运行期间根据实际类型确定方法调用版本的分派过程称为动态分派