方法调用不等同方法执行,唯一任务就是确定调用方法的版本(即调用哪一个方法)。Class文件编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是内存的入口地址(直接引用)。需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。
解析
所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且在运行期间是不可变的。符合这个前提的方法有:
1、静态方法:与类直接关联
2、私有方法:在外部不可被访问
两类方法都不可能通过继承或别的方式重写版本,它们都适合在类加载阶段进行解析。
解析调用一定是个静态过程,在编译期间就完全确定,在类加载的解析阶段就会转化为直接引用,不会延迟到运行期间完成。
分派
静态分派
所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用是方法重载。静态分派发生在编译阶段。
动态分派
在运行期间根据实际类型确定方法执行版本的分派过程称为动态分派,动态分派的典型应有有方法重写。