invokestatic --------------------->调用类方法(静态绑定,速度快)
invokevirtual -------------------->调用实例方法(动态绑定)
invokespecial -------------------->调用实例方法(静态绑定,速度快)
invokeinterface ----------------->调用引用类型为interface的实例方法(动态绑定)
如下的代码段:
class Animal{
private void eat(){
System.out.println("Animal");
}
public void action(){
eat();
}
}
class Cat extends Animal{
public void eat(){
System.out.println("Cat");
}
}
public class TestInvoke {
public static void main(String args[]){
Cat cat = new Cat();
cat.action();
}
}
其输出内容为:【Cat】
Animal的字节码如下:
Compiled from "TestInvoke.java"
class Animal extends java.lang.Object{
Animal();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void action();
Code:
0: aload_0
1: invokespecial #5; //Method eat:()V
4: return
}
Animal的Action的字节码中第二个操作的指令为invokespecial,为静态绑定,调用的是SuperClass中的方法。