java多态和重载_java 重载和多态的区别

本文探讨了Java中的多态实现,重点讲解了虚拟函数表和对象的隐藏成员在运行期的作用,以及如何实现动态分派。同时,解释了Java中方法分派指令,如invokespecial、invokevirtual等,并分析了成员数据解析的过程和访问权限验证。通过实例展示了静态类型和实际类型的分派区别以及成员数据的覆盖规则。
摘要由CSDN通过智能技术生成

虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员

--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。

虚函数表

成员方法的解析

java中方法分派指令:

invokespecial

invokevirtual

invokedynamic

involveinterface

静态类型,静态分派

实际类型,动态分派

成员数据解析

根据 java7虚拟机规范 , 成员数据解析过程描述如下:

为了将一个还没有解析的符号引用D解析成一个类(或者接口)C的一个成员,符号引用C必须被先解析。因此任何因在C被解析成类(或者接口)时失败导致抛出的异常都可以被解析符号引用D时抛出。如果C可以被解析成一个类(或者接口),则因D被解析成一个成员引用失败抛出的异常才可以被抛出。

如果C声明了和D符号引用(名称和描述符)一样的成员引用,则解析成功;

否则,解析过程递归到类C的直接实现(或者接口C直接继承)的接口中;

否则,如果C有父类S,则解析过程递归到S中;

否则,解析失败。

纵使上面解析成功,接着还会验证访问权限:

如果上面的解析过程解析失败,则直接抛出 NoSuchFieldError;

否则,如果没有对D没有 获取权限 ,则直接抛出 IllegalAccessError;

从上面的解析过程可以看到,对于成员数据的访

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值