方法的调用
符号引用转换为直接引用
方法的早期过程
静态链接----早期绑定
当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译器可知,且运行期保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接
总结:知道自己要调用什么东西叫作静态链接
动态链接----晚期绑定
被调用的方法在编译器无法被确定下来,称之为动态链接;表现为多态,参数为父类。传入子类对象。
非虚方法
如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法。
静态方法、私有方方法、final方法、实例构造器、父类方法都是非虚方法。
其它方法称为虚方法。
虚方法
不知道是哪个版本,子类的,父类的?接口的?
静态类型语言和动态类型语言
对变量类型的检查是在编译器还是运行期
方法执行过程
- 找到操作数栈顶的第一个元素的类型,去常量池中找,找到了返回
- 没找到向上再找。
虚方法表
就是对所有的方法建立一张索引表,能更快的访问到
方法的返回过程
- 存放调用该方法的PC寄存器的值
- 一个方法的结束:
- 正常执行完成
- 出现未处理的异常,非正常退出
- 方法正常退出,返回的是PC计数器的值,即调用该方法的指令的下一条指令的地址
- 正常完成和异常完成出口的区别在于:通过异常完成出口退出的不会给他上层调用者产生任何的返回值
正常返回
ireturn(boolean, byte, char, short, int类型时使用)
lreturn, freturn, dreturn, areturn.
return指令是直接返回void的方法
异常返回
测试代码:
public void test1(int i){ try{ byte x = 12; double sum = x; }catch (Exception e){ e.printStackTrace(); }finally { return; } }
附加信息
对程序调试提供支持的信息