一、非虚方法:
(1)如果方法在编译期间就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称之为非虚方法。
(2)静态方法,私有方法,final 方法,实例构造器,显式调用的方法 都是非虚方法。
(3)其他方法成为虚方法。
二、jvm提供了以下几条方法调用指令:
(1)普通调用指令:
1.invokestatic:调用静态方法,解析阶段确定唯一方法版本。
2.invokespecial:调用<init> 方法,私有及显式调用父类方法,解析阶段确定唯一方法版本。
3.invokevirtual:调用所有虚方法,隐式final 修饰的方法。
4.invokerinterface:调用接口方法。
(2)动态调用指令:
1.invokedynamic:动态解析出需要调用的方法,然后执行。
三、总结:前四条指令固化在虚拟机内部,方法的调用执行不可人为干预,而invokedynamic指令则支持用户确定方法版本。期中invokestatic指令和invokespecial指令调用的方法称之为非虚方法。其余的(final修饰的除外)称为虚方法。