方法调用不同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪个方法),暂时还不涉及方法内部的具体运行过程。
编译期间就能确定调用哪个方法-----解析
分派
分派过程将会揭示重载和重写在jvm是如何实现的。
静态分派
确定一个方法涉及几个角色,方法接收者、接收者的静态类型或实际类型、方法的描述符(主要是名称和参数)、参数的静态类型和实际类型。
静态分派过程是在编译期间发生的,根据方法接收者的静态类型、以及方法参数的静态类型确定方法的符号引用。
所谓的"编译期间就能确定"意思是,确定方法涉及到的接收者和方法参数类型都是静态类型,而静态类型是可以在编译期确定的。
但是运行期,方法的接收者是根据实际类型来确定的,也就是说静态分派实际上只是能在一个类的多个重载方法中确定一个方法,只是确定了方法的描述符,并不能确定真正的方法接收者。
静态分派的过程:
- 根据调用者的静态类型找到常量池中对应的class_info常量
- 根据调用参数的静态类型以及参数的个数和顺序确定常量池中的method_ref常量
例子1
例子2
总结
动态分派
动态分派和重写有着很重要的联系。
单分派与多分派