invok*家族

invokestatic :调用静态方法。
invokespecial:调用实例构造器init方法、私有方法和父类方法。
invokevirtual:调用所有的虚方法。
nvokeinterface:调用接口方法,会在运行时期再确定一个实现此接口的对象。 invokedynamic:现在运行时期动态解析出调用点限定符所引用的方法,然后再执行该方法,在此之前的4条指令,分派逻辑都是固化在虚拟机里面的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

只要能被invokestatic和invokespecial指令调用的方法都可以在解析阶段中确定唯一的调用版本,符合这个条件的有静态方法、私有方法、实例构造器、父类方法4类,它们在类加载阶段就会把符号引用解析为该方法的直接引用。这些方法称为非虚方法(还包括使用final修饰的方法,虽然final方法使用invokevirtual指令调用,因为final方法注定不会被重写,也就是无法被覆盖,也就无需对其进行多态选择)。

解析调用一定是一个静态的过程,在编译期间就可以完全确定,在类装载的解析阶段就会把涉及的符号引用全部转化为可确定的直接引用,不会延迟到运行期去完成。而分派调用可能是静态的也可能是动态的,根据分派一句的宗量数可分为单分派和多分派。因此分派可分为:静态单分派、静态多分派、动态单分派、动态多分派。

待续…

发布了45 篇原创文章 · 获赞 2 · 访问量 2590

猜你喜欢

转载自blog.csdn.net/u013915286/article/details/104402722