多态原理
创建多态对象时使用 invokespecial 字节码,调用对象方法时使用 invokevirtual 字节码
invokevirtual 指令在运行时的解析过程可以分为以下几步:
- 找到操作数栈顶的元素所指向的对象的实际类型,记作 C。
- 如果在类型 C 中找到与常量池中的描述符匹配的方法,则进行访问权限校验,如果通过,则返回这个方法的直接引用,查找结束,否则返回 java.lang.IllegalAccessError 异常。
- 常量池找不到方法,则按照继承关系从下往上依次对 C 的各个父类进行第二步的搜索和验证。
- 如果始终没有找到合适的方法,则抛出 java.lang.AbstractMethodError 异常。