方法重载与invokevirtual字节码指令的关系
Posted linlf03
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方法重载与invokevirtual字节码指令的关系相关的知识,希望对你有一定的参考价值。
1、方法重载
创建MyTest5类
public class MyTest5 public void test(Grandpa grandpa) System.out.println("grandpa"); public void test(Father father) System.out.println("father"); public void test(Son son) System.out.println("son"); public static void main(String[] args) Grandpa g1 = new Father(); Grandpa g2 = new Son(); MyTest5 myTest5 = new MyTest5(); myTest5.test(g1); myTest5.test(g2); class Grandpa class Father extends Grandpa class Son extends Father
输出结果如下:
方法的静态分派
Grandpa g1 = new Father();
以上代码,g1的静态类型是Grandpa,而g1的实际类型(真正的指向的类型)是Father
我们可以得出这样一个结论:变量的静态类型是不会发生变化的,而实际类型则可以发生变化的(多态的一种体现),实际类型是在运行期方可确定。
方法重载,是一种静态的行为,编译期就可以完全确定。
所以MyTest5最终的输出结果两个都是grandpa
使用jclasslib,调用两个test方法,使用的都是invokevirtual指令
以上是关于方法重载与invokevirtual字节码指令的关系的主要内容,如果未能解决你的问题,请参考以下文章
jvm原理(32)方法重载与invokevirtual字节码指令的关系
jvm原理(33)通过字节码分析Java方法的静态分派与动态分派机制(invokevirtual 指令)
jvm原理(33)通过字节码分析Java方法的静态分派与动态分派机制(invokevirtual 指令)