方法调用不等于方法被执行,他的唯一作用是
确定执行方法的版本,即确定方法对应的直接引用。
- 解析
编译过程中就确定的方法,会直接在解析过程中由符号引用转为直接引用,符合此条件的有:静态方法、私有方法、实例构造器、父类方法这四种方法。
- 分派
- 静态分派(重载的实现方式:运行期间不会变,只能确定一个更适合的版本)
- 动态分派(重写的实现方式:原理是
in m]\ vokevirtual指令,在运行期间动态寻找最优版本)
- invokevirtual指令多态查找过程
- 取操作数栈顶中指向的具体对象C
- C的描述符和简单名称是否符合常量中的描述? 是—— 返回直接地址(会进行校验,若校验失败抛出IllegalAccessError)
- 按照继承关系
从下往上查找C的父类并校验 - 找不到,抛出AbstractMethodError