面向对象特征之————多态

多态分为:编译时多态 和 运行时多态。在这里插入图片描述


编译时多态:编译期 就能确定我要调用 多个重载的方法中的哪一个,具体是调用子类的还是父类的那个方法是不确定的。
实现:重载

运行是多态:程序运行时才能确定要调用哪个方法(是调用子类的那个方法 还是 调用父类的那个方法)。这在编译时是不能确定的。
怎么样才能展现出多态的效果:重写。
实现机制:动态绑定。
Java 对于方法调用动态绑定的实现主要依赖于方法表。
方法表:位于方法区的某个类的类信息中。方法表中的方法包括从父类继承的所有方法以及自身重写(override)的方法。


在这里插入图片描述
Person p = new Girl();
p.speak();

原理:
1、JVM首先查看父类Person的方法表,得到speak方法在该方法表的偏移量(即:一个Index索引位置),这样就得到该方法的直接引用。
2、 根据this指针(this指针的信息位于:编译后的class文件中) 确定对象的实际类型,然后使用实际类型的方法表。在实际类型的方法表中找对应的方法条目,根据方法条目指向哪个类的方法代码,去调用。如果该类重写了父类的方法,则直接调用实际类型的方法;否则如果该类没有重写。则按照继承关系从下往上搜索直至找到那个方法。


JVM 的方法调用指令有四个 分别是 invokestatic,invokespecial,invokesvirtual 和 invokeinterface。前两个是静态绑定,后两个是动态绑定的。本文也可以说是对于JVM后两种调用实现的考察。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值