方法重载与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 指令)

今日拾遗 20200627:java 的动态分派,到底包含哪些知识点?

java7 invokedynamic命令研究

JVM进阶之字节码指令解析(中篇)