方法调用
方法调用的目的是确定被调用方法的版本。
预备知识复习
Class文件在编译的过程中,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(直接引用),需要在类的加载期间甚至是运行期间才能确定目标方法的直接引用。(这样做的好处是动态扩展能力的增强。)
解析
在类加载解析阶段,将符号引用转化为直接引用的过程,调用目标在程序代码写好,编译器进行编译的时候就必须确定下来,这类方法的调用称为 解析。
解析是一个静态的过程,在编译器就完全确定,在装载的解析阶段就会将涉及的符号引用全部转为可确定的直接引用。
这类的方法(叫做非虚方法)主要包括:静态方法 和 私有方法, 实例构造器和父类方法, final方法。
分派
分派调用 可能为静态或者动态的,主要分为 静态(动态)单(多)分配4种情况。下面复习虚拟机是如何确定正确目标方法。
静态分派
Human man = new Man( );
其中Human 称为 变量的静态类型, 而Man 为变量的实际类型。 静态类型的变化仅仅在使用时变化,变量的本身的静态类型不会被改变,并且最终的静态类型在编译器可知的; 而实际类型变化的结果在运行期才可以确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。(其实不太明白)
所有依赖静态类型来定位方法执行版本的分派动作,都称为静态分配。