Java中的静态单多分派与动态单分派

JVM 专栏收录该内容
5 篇文章 0 订阅

什么是单分派,什么是多分派呢???

   先看定义:根据一个宗量的类型进行方法的选择称为单分派


                  根据多于一个宗量的类型对方法的选择称为多分派

那么宗量又是个什么东东呢?????

   再看定义:方法的接受者与方法的参数统称为方法的宗量。


定义看着确实有点儿晕,还是直接上例子吧!!!!!!!!!


package test;

public class Dispatch {

	static class Ipad{}
	static class Iphone{}
	public static class Father{
		public void hardChoice(Ipad arg){
			System.out.println("Father choice Ipad!!!");
		}
		public void hardChoice(Iphone arg){
			System.out.println("Father choice Iphone!!!");
		}
	}
	public static class Son extends Father{
		public void hardChoice(Ipad arg){
			System.out.println("Son choice Ipad!!!");
		}
		public void hardChoice(Iphone arg){
			System.out.println("Son choice Iphone!!!");
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       Father father = new Father();
       Son son = new Son();
       
       father.hardChoice(new Ipad());
       son.hardChoice(new Iphone());
	}

}

输出:

Father choice Ipad!!!
Son choice Iphone!!!

下面看看编译阶段编译器的选择过程,也就是静态分派的过程。

这个时候,选择目标方法依据两点:

      一个是静态类型Father和Son,

      二是方法参数Ipad和Iphone。

这次选择的结果的最终产物是产生了两条invokevirtual指令,两条指令的参数分别为常量池中指向Father.hardChoice(ipad)

Father.hardChoice(iphone)方法的符号引用。因为是根据两个宗量进行选择,所以Java语言的静态分派属于多分派类型。


再看看运行阶段虚拟机的选择,也就是动态分派的过程。

     在执行son.hardChoice(new Ipad())这句代码时,由于编译期已经决定目标方法的签名必须为hardChoice(Ipad),虚拟机不会关心传递过来的参数到底是什么,因为这时参数的静态类型、实际类型都对方法的选择不会构成任何影响,唯一可以影响虚拟机选择的因素只有此方法的接受者的实际类型到底是Father还是Son。因为只有一个宗量作为选择一句,所以Java语言的动态分派属于单分派类型。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值