Java具备面向对象的三大特征:封装、继承、多态。分派过程将会揭示多态特征的一些最基本体现
单分派与多分派
方法的接收者与方法的参数统称为方法的宗量
《Java与模式》
根据分派基于多少种宗量,可以将分派划分为单分派和多分派两种。单分派是根据一个宗量对目标方法进行选择,多分派是根据多个宗量对目标方法进行选择。
//单分派、多分派演示
public class Dispatch {
static class IE{}
static class Chrome{}
public static class ProductManager{
public void Choice(IE arg){
System.out.println("ProductManager choose IE");
}
public void Choice(Chrome arg){
System.out.println("ProductManager choose Chrome");
}
}
public static class Programmer{
public void Choice(IE arg){
System.out.println("Programmer choose IE");
}
public void Choice(Chrome arg){
System.out.println("Programmer choose Chrome");
}
}
public static void main(String[] args) {
ProductManager productManager = new ProductManager();
Programmer programmer = new Programmer();
productManager.Choice(new IE());
programmer.Choice(new Chrome());
}
}

对于运行结果相信不用做过多解释。
我们来看看编译阶段编译器的选择过程,也就是静态分派过程。这是选择目标方法的依据有两点:静态类型、方法参数。这次选择结果的最终产物是产生了两条invokevirtual指令,分别为常量池中指向XX.Choice(IE)和XX.Choice(Chrome)方法的符号引用。
因为是根据两个宗量进行选择,所以Java语言的静态分派属于多分派类型。
再来看运行阶段虚拟机的选择,也就是动态分派过程。在执行XX.Choice(new IE())时,准确的说是在执行这句代码所对应的invokevirtual指令时,由于编译期已经确定m目标方法的签名必须为 Choice(IE) ,虚拟机不会关心传递过来的是“IE6”还是“IE7”,因为这时参数的静态类型、实际类型都对方法的选择不会构成任何影响,唯一可以影响虚拟机选择的因素只有此方法的接收者的实际类型是ProductManager还是Programmer。
因为只有一个宗量作为选择的依据,所以Java语言的动态分派属于单分派类型