JVM对于静态绑定可以在链接解析阶段直接识别目标方法的情况;
对于动态绑定需要在运行的时候根据调用者的情况去查询方法表的索引来获取对应的目标方法。
动态绑定包括:invokevirtual, invokeinterface
方法表本质上是一个数组,每个数组元素指向一个当前类及其祖先类中非私有的实例方法。
满足两个特质:
1,子类方法表包含父类方法表中所有方法
2,子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同
对于静态绑定的方法调用直接指向具体的目标方法,对于动态绑定实际引用是方法表的索引值。
为了更高效的处理动态绑定,即时编译还存在两种性能更好的优化手段:内联缓存和方法内联
内联缓存?
能够缓存调用者的动态类型,以及该类型所对应的目标方法。如果碰到以缓存的类型,直接调用该缓存对应的目标方法;如果没有碰到就会退化到方法表查询。
多态:单态,多态,超多态
JVM只采用单态内联缓存。JAVA绝大多数对象都是单态的