深入拆解虚拟机(四)JVM是如何执行方法调用的?(上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwl2014100338/article/details/84190630
重载与重写

(1)Java程序里,如果同一个类出现多个名字相同,并且参数类型相同的方法,那么它无法通过编译

(2)在正常情况下,如果我们想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同。这些方法之间的关系,我们称之为重载

(3)选取重载方法的三个阶段:

  • 在不考虑对基本数据类型自动拆箱,以及可变长参数的情况下选取重载方法
  • 如果在第1阶段中没有找到适配的方法,那么在允许自动拆箱,但不允许可变长参数的情况下选取重载方法
  • 如果在第2阶段中没有找到适配的方法,那么在允许自动装拆箱以及可变长参数的情况下选取重载方法

(4)如果Java编译器在同一阶段找到多个适配的方法,那么他会选择一个最为贴切的,而决定贴切程度的一个关键就是形式参数类型的继承关系

(5)除了同一个类中的方法,重载也可以作用于这个类所继承而来的方法。比如,自己定义了与父类中非私有方法同名的方法,而且这两个方法的参数类型不同,那么在子类中这两个方法构成了重载

(6)如果子类中定义了与父类中非私有方法同名的方法,而且方法参数类型相同,如果这两个方法都是静态的,那么子类中方法隐藏父类中方法。如果这两个方法都不是静态的,且都不是私有的,那么子类方法重写了父类方法


动态绑定和静态绑定

(1)在Java虚拟机中,静态绑定指的是在解析时便可以直接识别目标方法的情况,而动态绑定则指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。
(2)由于Java编译器已经区分了重载的方法,因此可以认为Java虚拟机中不存在重载


调用指令的符号引用

在class文件中,Java编译器会用符号引用指代目标方法。在执行调用指令之前,它所附带的符号引用需要被解析成实际引用。对于可以静态绑定的方法调用而言,实际引用为目标方法的指针。对于需要动态绑定的方法调用而言,实际引用为辅助动态绑定的信息


Java的重写与Java虚拟机的重写并不一致,但是编译器会通过生成桥接方法来弥补。


猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/84190630