为什么 网上的人都说 java 只支持 单分派不支持双分派?

这段代码摘子某书[code=Java]

public class Dispatch{

static class QQ{}

static class _360{}

public static class Father{

public void hardChoice(QQ arg){

System.out.println("father chooes qq");}

public void hardChoice(_360 arg){

System.out.println("father chooes 360");}

}

public static class Son extends Father{

public void hardChoice(QQ arg){

System.out.println("son chooes qq");

}

public void hardChoice(_360 arg){

System.out.println("son chooes 360");

}

}

public static void main(String [] args){

Father father=new Father();

Father son=new Son();

father.hardChoice(new _360());

son.hardChoice(new QQ());

}

}

结果是

father chooes 360

son chooes qq

[/code]

先说下概念  静态分派

比如 Human man=new Man();

Human  是静态类型 , Man 称为变量的实际类型  ,静态类型和实际类型在程序中都可以变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会变化,并且最终的静态类型在编译时刻可知,而实际类型的变化在运行时刻菜可知。

虚拟机重载的时候通过静态类型判断选择哪个重载版本,对于所有依赖静态类型来定位方法执行版本的动作称作静态分派。

静态方法在类加载的时刻就被解析,所以静态方法也是可以拥有多个重载版本的,选择版本的过程通过静态分派完成。

我们上面的例子里面 选择目标方法有两点  :静态类型是 Father 还是 Son 方法参数是 360 还是 QQ ,这次选择产物是两条

invokespecial 指令,这两条指令分别为常量池中指像 Father.hardChoice(360),Father.hardChoice(QQ)方法的符号引用,

因为此次选择是依据两个宗量 ,所以 可以证明 java 是静态多分派的。

在运行阶段的选择过程,是动态分派的过程,此时不会关心传入的参数类型,因为都不会对方法选择进行影响,唯一可以影响的也就是 接受者的实际类型 也就是 Father 还是 Son ,因为只有一个宗量作为选择一句,所以java 的动态分派是单分派的。

java 双分派_双分派 和 访问者模式详解 | 学步园相关推荐

  1. (二十二)访问者模式详解(伪动态双分派) - 转

    作者:zuoxiaolong8810(左潇龙),转载请注明出处. 本次LZ和各位分享一下访问者模式,从场景.设计初衷以及实现方面来说,访问者模式算是LZ即将写到的24种设计模式当中,最复杂也是最难理解 ...

  2. 高斯消元法java语言设计_高斯消元法(Gauss Elimination)【超详解模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵. 高斯消元法的原理是: 若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程 ...

  3. java不规则算法_分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...

  4. Java里氏转换_里氏代换原则、依赖倒转原则 | 学步园

    里氏代换原则 面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化,具体化也就是给出不同的实现. 继承关系就是一种从抽象化到具体化的导出. 里氏代换原则:如果对每一个类型为T1的对象o1,都有类 ...

  5. java jtable 排序_解决JTable排序问题的方法详解

    JTable的排序是一个让人头疼的问题,Sun没有为排序这个最常用的功能提供类. 但是近日翻看Sun官方java的tutorial,却发现其在文档中提供了这个类的实现,使用非常简单! 使用方法示例: ...

  6. java 静态方法顺序_静态方法的加载顺序详解

    Java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调 ...

  7. java+决策树结构_机器学习——决策树,DecisionTreeClassifier参数详解,决策树可视化查看树结构...

    释放双眼,带上耳机,听听看~! 0.决策树 决策树是一种树型结构,其中每个内部节结点表示在一个属性上的测试,每一个分支代表一个测试输出,每个叶结点代表一种类别. 决策树学习是以实例为基础的归纳学习 决 ...

  8. java 矩阵分解_矩阵论学习笔记四:矩阵分解 | 学步园

    参考书:<矩阵论>第3版,程云鹏 张凯院 徐仲编著 西北工业大学出版社 矩阵的三角分解和QR分解等在计算数学中都扮演着十分重要的角色,尤其是以QR分解所建立的QR方法,以对数值线性代数理论 ...

  9. java schedule参数_【摘抄】关于Java schedule job Timer的schedule方法详解 | 学步园

    Timer timer = new Timer(true); timer.schedule(TimerTask, delay, interval); 创建timer时使用new Timer(true) ...

最新文章

  1. LeetCode实战:缺失的第一个正数
  2. wald检验_笔记:分位数回归斜率相等性检验(Wald检验)
  3. JS setTimeout 与 setInterval
  4. python中如何调用函数_我写了一个函数,如何在python中调用
  5. E:Tree Queries(假树链剖分写法)
  6. wamserver怎么把mysql找回来_将php连接wampserver自带的MySQL数据库 所遇到各种问题解决办法...
  7. 【OpenCV 例程200篇】87. 频率域钝化掩蔽
  8. LNMP-Linux下Nginx+MySQL+PHP+phpMyAdmin+eAcelerator一键安装包
  9. spring的环境配置(beans profile=xxx)
  10. 16岁学计算机,16岁学生能学计算机吗
  11. 判断鼠标向右或向左滑动,响应不同的事件
  12. 7 php 内存泄漏_php 大数组导致内存泄露问题
  13. IE8兼容html5视频播放
  14. pycharm破解补丁激活
  15. qlikview从mysql中抽取数据的过程,mysql数据同步到sqlserver的过程
  16. 在开发板上显示彩虹c语言(800*480屏幕)
  17. uml的用例图中扩展关系与包含关系
  18. 输入某辆小轿车三次的 耗油量(升)和行驶里程(公里),计算平均油耗(升/百公里)。
  19. ubuntu20.04开机后出现 /dev/sdb3 xxx files xxxx/xxxxx blocked,无法进入桌面问题
  20. 开发小程序需要服务器吗?小程序服务器配置要求

热门文章

  1. Maven学习总结(58)—— 常用的 Maven 镜像地址和中央仓库地址汇总
  2. Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
  3. Spring MVC学习总结(13)——Spring MVC集成Swagger时文档无法排序问题
  4. Docker学习总结(4)——Docker镜像与容器命令
  5. 为什么突然变乱码_9102年了,还不知道Android为什么卡?
  6. Mysql原理、主从复制、半同步复制及基于SSL复制
  7. 不小心运行了一个***程序~word 2003 打开2007格式文件的转换器.rar 里的
  8. 可用于Asp.net的嵌入式数据库SqlCE4.0试用笔记
  9. 将mbr的分区改为gpt分区
  10. form数据请求参数格式