昨晚群友来电询问关于JVM中itable的一些问题
先看看群友发来的代码。
interface IA{
void f();
}
class A impl IA{
void f(){
}
}
class B extends A{
void g();
}
IA foo = new B();
foo.f();
群友的问题:上面的代码,foo调用f时,是如何实现的?
首先,我们确定下在JAVA中调用方法时用到的几个指令
invokeinterface 使用的是itable
invokevitual 使用的是vtable
invokesepical 直接调用不需要转换
invokestatic 直接调用不需要转换
JAVA编译器在生成字节码的时候,就根据上面的代码生成了invokeinterface的调用,在JVM执行调用时,会依次先找foo的itable中的f方法,没有找到 就继续找父类的itable中的f方法。