在 java 虚拟机中,方法的调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用的方法的阿布呢不能,不涉及方法内部的棘突执行过程。一切方法调用在class文件里面存储的都只是符号引用,不是方法在实际运行时内存布局中的入口地址。
JVM在解析时, 在调用目标程序代码写好、编译器进行编译时就必须确定下来;
在java中, 符合“编译期可知,运行期不可变” 这个要求的方法主要有:静态方法(与类型直接关联)和私有方法(外部不可访问),这些方法都不能通过继承或者重写来修改,因此他们在类加载阶段进行解析。
与上边对应的 就是在Java虚拟机里边提供了四条方法调用字节码指令:
1.invkestatic:调用静态方法
2.invokespecial:调用实例构造器<init>方法、私有方法和父类方法
3.invokevirtual:调用所有虚方法
4.invokeinterface:调用接口方法
”编译期可知,运行期不可变“ 这类方法 只能被 invokestatic 和 invokespecial 指令调用,包含:
静态方法、私有方法、实例构造器、父类方法。
解析调用是个静态过程,编译期间就完全确定了。
分派调用测可能是静态也可能是动态的,可以分为单分派和多分派这样就有了:
静态单分派
静态多分派
动态单分派
动态多分派
静态分派:(overload)重载
动态分派:(override) 重写
待续....................