方法调用的字节码指令:
字节码指令 | 作用 |
---|---|
invokestatic |
调用静态方法 |
invokespecial |
调用私有实例方法、构造器及 super 关键字等 |
invokevirtual |
调用非私有实例方法,比如 public 和 protected |
invokeinterface |
和上面这条指令类似,不过作用于接口类 |
invokedynamic |
调用动态方法 |
非虚方法(静态绑定)
在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。
invokestatic
静态方法invokespecial
私有实例方法、实例构造器和父类方法- 一部分被
final
修饰的invokevirtual
方法:非私有实例方法public
和protected
虚方法(动态绑定)
方法在运行时是可变的。很多时候,JVM 需要根据调用者的动态类型,来确定调用的目标方法,这就是动态绑定的过程;相对比,invokestatic
指令加上 invokespecial
指令,就属于静态绑定过程。
- 未被被
final
修饰的invokevirtual
方法 invokei