码迷,mamicode.com
首页 > 其他好文 > 详细

方法重载与invokevirtual字节码指令的关系

时间:2019-06-29 22:29:22      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:mamicode   编译   fat   on()   out   pre   class   code   调用   

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字节码指令的关系

标签:mamicode   编译   fat   on()   out   pre   class   code   调用   

原文地址:https://www.cnblogs.com/linlf03/p/11107879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!