美文网首页
重载选择(静态分派),解析调用与动态分派(多态)的特性研究

重载选择(静态分派),解析调用与动态分派(多态)的特性研究

作者: 树心图物 | 来源:发表于2019-04-22 21:23 被阅读0次

根据周志明《深入理解java虚拟机》所述,国内把重载方法的选择过程叫做静态分派,除此之外是解析调用和动态分派。个人认为这种叫法并不是很好,因为重载选择(静态分派)是在编译成字节码后,也就是编译期时就确定了,而且“重载选择“和“解析调用”有一定的概念上的交叉,没有交叉的概念是解析调用和动态分派,重载选择的概念在java源代码中存在,到字节码后已经完成选择,在字节码级别可以根据调用指令(有一个例外)来区分解析调用和动态分派。

在字节码级别,invokespecial,invokestatic调用一定是解析调用,在编译期就确定了调用哪个方法,不会有变更。final修饰的方法虽然用invokevirtual调用,但是因为不会被重写,也是编译期确定的,所以也是解析调用(只有这个例外)。

在字节码级别,invokevirtual调用非final方法,invokeinterface调用方法是动态分派。

方法接收者:比如 People p = new Boy(); p.sayHello(); p就是接收者。p的静态类型为People,实际类型为Boy。
方法的调用者:调用方法的语句所在上下文那个方法

重载选择的一些特性:

  • 根据接收者的静态类型和方法参数的静态类型来确定选择哪个方法
  • 方法参数的静态类型匹配有相应的准确性原则,不是严格要求静态类型一定要完全对应的,若找不到完全对应的方法,会提升传入实参的类型去找到最“准确”的方法。比如 hello(People p)这个方法,若传入一个Child类型的参数而且Child继承People,那么在没有Hello(Child c)方法的情况下,会选择hello(People p)
  • 可变长度参数的方法也会找最“准确”的方法,可变参数本身优先级低。比如存在hello(String s)和hello(String... ss),在调用hello("world")时会选择更”准确“的hello(String s)方法
  • 重载选择还要注意方法接受者的静态类型,若方法接受者静态类型中完全找不到对应的方法,会报错,不会在接受者静态类型的子孙类中寻找

相关文章

  • 重载选择(静态分派),解析调用与动态分派(多态)的特性研究

    根据周志明《深入理解java虚拟机》所述,国内把重载方法的选择过程叫做静态分派,除此之外是解析调用和动态分派。个人...

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

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

  • 多态->分派

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

  • Java方法分派

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

  • Java 分派

    静态分派 重载属于静态分派 靠静态类型来判断 如上代码中输出为: 动态分派 重写属于动态分派 靠实际类型来判断 如...

  • Java虚拟机——方法调用

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

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

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

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

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

  • Java,重载的陷阱,静态分派,重写,动态分派。

    本文描述的内容如题:重载的陷阱,静态分派,重写,动态分派 我刚看代码的时候,是以为结果会是hello,gentle...

  • java方法调用-动态分派

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

网友评论

      本文标题:重载选择(静态分派),解析调用与动态分派(多态)的特性研究

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