虚方法
什么是虚方法
java中没有明确说明什么是虚方法,虚方法是C++来的
java虚方法可以理解为java里所有被overriding的方法都是virtual的,所有重写的方法都是override的.
虚方法调用
Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。
Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。那么,相对于静态绑定的非虚方法调用来说,虚方法调用更加耗时。
在 Java 虚拟机中,静态绑定包括用于调用静态方法的 invokestatic 指令,和用于调用构造器、私有实例方法以及超类非私有实例方法的 invokespecial 指令。如果虚方法调用指向一个标记为 final 的方法,那么 Java 虚拟机也可以静态绑定该虚方法调用的目标方法。
方法表
类加载机制的链接部分的准备阶段,除了为静态字段分配内存之外,还会构造与该类相关联的方法表.
这个数据结构,便是 Java 虚拟机实现动态绑定的关键所在。
invokevirtual 使用的虚方法表(virtual method table,vtable) invokeinterface 使用的接口方法表(interface method table,itable)
方法表本质上是一个数组,每个数组元素指向一个当前类及其祖先类中非私有的实例方法。
参考文章:gk.link/a/11V4M