美文网首页
java方法调用-单分派与多分派

java方法调用-单分派与多分派

作者: gzss | 来源:发表于2019-07-24 22:11 被阅读0次

根据分派基于多少种宗量(方法的接收者与方法的参数统称为方法的宗量),可以将分派划分为单分派和多分派两种。单分派是根据一个宗量对目标方法进行选择,多分派则是根据多余一个宗量对目标方法进行选择。

单分派和多分派的定义读起来拗口,从字面上看也比较抽象,下面通过一个例子来具体看一下。

运行输出

father choice 360

son choice QQ

在main函数中两次调用hardChoice方法,这两次的结果输出如上。

我们来看看编一阶段编译器的选择过程,也就是静态分派的过程。这时选择目标方法的依据有两点:一是静态类型是father还是son,二是方法参数是QQ还是360.这次选择的最终结果产物是产生了两条invokevirtual指令,两条指令的参数分别为常量池中指向father.hardChoice(360)和Father.hardChoice(qq)方法的符号引用。因为是根据两个宗量进行选择所以Java语言静态分派属于多分派。

再看看运行时虚拟机的选择,也就是动态分派过程,在执行“son.hardChoice(QQ)”这句代码时,更准确的说,是执行这句代码所对应的invokevirtual指令时,由于编译期已经决定目标方法的签名必须为hardChoice(QQ),虚拟机此时不会关心传递过来的参数QQ到底是腾讯的还是阿里的,因为这时参数的静态类型、实际类型都对方法的选择不会构成实际影响,唯一可以影响虚拟机选择的因素只有此方法的接收者的实际类型是father还是son。因为只有一个宗量作为选择依据,所以Java的动态分派属于单分派类型。

相关文章

  • java方法调用-单分派与多分派

    根据分派基于多少种宗量(方法的接收者与方法的参数统称为方法的宗量),可以将分派划分为单分派和多分派两种。单分派是根...

  • 虚拟机字节码执行引擎【方法调用(二)单分派与多分派】

    单分派与多分派 方法的接收者与方法的参数统称为方法的宗量(来源于《Java与模式》)。根据分派基于多少种宗量,可将...

  • java虚拟机之方法调用(下)——单分派与多分派

    前言 上一篇讲解了静态分派和动态分派,还不清楚的同学可以先看看:java虚拟机之方法调用(上)——静态分派与动态分...

  • Java方法分派

    静态分派 - 方法重载分派编译期确定根据调用者的声明类型和方法参数类型分派 动态分派 - 方法重写分派运行时确定根...

  • java方法调用-静态分派

    在聊静态分派前,我们先看一段代码,想象一下程序的输出结果是什么。后面我们将围绕这个类的方法来重载(overload...

  • java方法调用-动态分派

    前一篇文章聊了一下方法调用中的静态分派,这次我们聊下动态分派的过程,他和多态的另外一个重要体现-重写(overri...

  • Java静态分派、动态分派、双重分派

    动态分派和静态分派机制是java多态的实现原理。 静态分派(方法重载) 静态分派机制最典型的代码: 这段代码执行完...

  • Java中的静态分派和动态分派

    静态分派 有如下代码: 在客户端定义了几个方法并调用如下: 输入结果为: 静态分派:对应Java语言的重载(Ove...

  • 多态->分派

    摘抄深入理解java虚拟机目标 分派包括: 静态分派与动态分派两种类型, 静态分派的使用场景为重载, 动态分派使用...

  • Java虚拟机——方法调用

    方法调用要确定被调用的方法版本,分为三种,解析调用、静态分派和动态分派。 解析调用 解析调用时调用目标在程序代码写...

网友评论

      本文标题:java方法调用-单分派与多分派

      本文链接:https://www.haomeiwen.com/subject/umvzhctx.html