53-通过字节码分析Java方法的静态分派与动态分派机制

通过字节码分析Java方法的静态分派与动态分派机制

  • 方法的动态分派:

    • 方法的动态分派涉及到一个重要的概念:方法接受者。
    • 多态,运行期的行为,涉及到invokevirtual字节码指令的多态查找流程:
      • 首先,到操作数的栈顶,去寻找到栈顶的元素所指向的这个对象的实际类型;
      • 第二步:如果在上面的过程当中寻找到了与常量池当中的“这个描述符“[下面这段]
     invokevirtual #6 <jvm/bytecode/Fruit.test>
    

    和名称相同的这个方法,并且也具备一些相应的访问权限,那么,它就直接的返回这个目标方法的直接引用。

    • 第三步:如果找不到,就按照继承的这种层次关系,从子类往父类,依次对他的各个父类重复的进行这种查找的流程,一直到真正的能够符合①②步要求的特定的对象的方法,然后去执行
    • 如果上面的三步找不到,那就抛异常吧!
  • 比较方法重载(overload)与方法重写(overwrite):可以得到下面的结论

    • 方法重载是静态的,是编译器行为;方法重写是动态的,是运行期行为。
    • 所以,Java中多态和方法重载并没有什么直接关系,相反,它和方法重写有着密不可分的关系。
public class MyTest6 {
    public static void main(String[] args) {
        Fruit apple = new Apple();
        Fruit orange = new Orange();

        apple.test();
        orange.test();

        apple = new Orange();
        apple.test();
    }
}
class Fruit{
    public void test(){
        System.out.println("Fruit");
    }
}
class Apple extends Fruit{
    @Override
    public void test(){
        System.out.println("Apple");
    }
}
class Orange extends Fruit{
    @Override
    public void test(){
        System.out.println("Orange");
    }
}
运行结果:
   Apple
   Orange
   Orange

反编译指令集:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值