标签:报错 方法内联 参数 不同 关系 执行 绑定 静态绑定 static
jvm是如何进行方法的调用的?
方法重载:方法名相同,参数类型不同的一组方法的关系,叫做方法重载。在编译阶段就能够确定具体调用哪个重载方法。
方法重写:子类方法跟父类的方法名参数类型一样,叫做方法重写。会根据调用者的动态类型选取实际的目标方法。
java虚拟机会根据方法描述判断方法是否重写。非私有,非静态,参数类型,返回值相同才会被jvm判定为重写。
静态绑定,在类加载的解析阶段能够确认目标方法。
invokestatic 静态方法
invokespecial 私有方法,构造方法。接口的默认方法。
动态绑定,在运行时才确定的目标方法。有点编译看左边,运行看右边的味道。
invokevirtual 非私有实例方法
invokeinterface 接口方法
invokedynamic 动态方法
类加载的解析阶段详解:
如何转换?:对于类和接口,将符号引用解析成为实际引用的流程有所差异,但是大体是。
先找自己类中符合的方法,没有就找父类,直到Objec类。还是没有,就找接口非静态,非私有方法。找不到就报错。
对于静态绑定的方法而言,实际引用就是目标方法的内存地址,对于动态绑定的方法,实际引用就是方法表的索引。
虚方法
编译为这两个invokevirtual invokeinterface指令的方法,叫做虚方法。
被final修饰的虚方法,可以静态绑定。其余的虚方法,依靠方法表实现
方法表
在类加载的解析阶段,会构造一个方法表
方法表包含自己和父类的所有方法。子方法表的方法索引值与重写的父类方法的索引值相同(重写时指向自己的方法)。
java虚拟机在运行时,根据调用者的实际类型,在该类型的方法表中找到要执行的方法。
虚方法调用的优化(即时编译优化)
内联缓存
java虚拟机只采用了单态内联缓存。只缓存一种动态类型和目标方法。命中则返回目标方法,否则退化为方法表查找。
方法内联
标签:报错 方法内联 参数 不同 关系 执行 绑定 静态绑定 static
原文地址:https://www.cnblogs.com/haiqichen/p/13645849.html