java 实现多态的原理 群友的问题,itable的一些问题

昨晚群友来电询问关于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方法。

posted @ 2022-02-19 17:52  方东信  阅读(132)  评论(0编辑  收藏  举报