首页 > 其他分享 >方法继承的真相---虚方法表

方法继承的真相---虚方法表

时间:2023-02-25 22:44:56浏览次数:47  
标签:调用 真相 继承 子类 --- 表中 父类 方法

  • 虚方法表
  • 方法重写的本质

我们关注一个类往往会把注意点放在它的成员变量上,而对于他的成员方法往往关注的比较少。在类的继承中我们知道成员方法往往都会被继承,但是对于成员方法往往会有许多疑惑

  • 之前观点:
    以前方法调用特点:当该类的对象调用一个方法,会先在本类中寻找该方法,如果本类中没有找到,会到父类中寻找,如果父类中没有找到,将会到父类的父类中寻找该方法,以此反复

现在看来我当时的思想还是有矛盾的。如果方法可以被继承,在子类中应该是将父类的方法都继承了下来,为什么需要一级一级的向上去寻找呢?如果都没有被继承,如果用到父类的方法不总是要向上去寻找吗?这样会不会影响效率?

  • 当我们类的继承结构如下图时:

    这时我们需要调用的一个方法在顶级父类p类中,我们需要从A类开始一级一级的向上去寻找,这样效率应该会很低,我们的java设计者也想到了这一点,于是设计出了虚方法表进行优化

虚方法表优化

虚方法表
指的是由1.非private 2.非static 3.非final修饰的方法组成的常用方法的列表

在一段继承结构中:会从顶级父类开始把自己常用的方法抽取出来放到自己的虚方法表中,并在里面加上自己的常用方法,并将虚方法表交给自己的子类,以此反复

在虚方法的添加结束后,每一个类都有自己的虚方法表,其中包含自己和自己所有父类的常用方法

在方法调用的时候,会优先在自己的虚方法表中寻找,如果没有向上寻找,以此提高效率

方法继承的本质

在将常用方法添加到虚方法表中并交给子类,其实这个过程就是方法的继承,实际添加到虚方法表中的方法被继承到了子类中,可以得出结论:只有虚方法才能被继承
举例说明:


以上的继承结构实际是:Zi-->Fu-->Object
我们的Object类中只有5个虚方法,添加到虚方法表中并交给Fu,Fu中有一个虚方法,添加到虚方法表中并交给Zi,

方法重写的本质


方法重写的本质就是父类该方法在子类虚方法表中的内容

我们的B类如果要调用method1这个方法会先在虚方法表中进行寻找,调用的是C类中的mehtod1方法,当我们在B类中进行重写C类的method1方法,实际上是重写在虚方法表中的method1,再次调用的时候就是调用新重写的method1

标签:调用,真相,继承,子类,---,表中,父类,方法
From: https://www.cnblogs.com/swtaa/p/17155532.html

相关文章

  • python基础-集合set { }
    集合的定义和操作集合的特性:元素数量支持多个元素类型任意下标索引支持重复元素不支持可修改性支持数据有序否使用场景不可重复的数据记录......
  • python基础-字典dict {key:value }
     字典的定义和操作字典的特性:元素数量支持多个元素类型任意下标索引支持重复元素不支持可修改性支持数据有序否使用场景不可重复的数据......
  • 【csp-1】现值计算
    试题编号:202212-1试题名称:现值计算时间限制:1.0s内存限制:512.0MB问题描述:问题描述评估一个长期项目的投资收益,资金的时间价值是一个必须要考虑到的因......
  • 主题阅读笔记 - 高效  
    主题阅读笔记-高效2023-02-25高效技术学习:三个方法1).寻找学习第一手信息源-源头2).学习掌握基础-原理3).建立知识图完善知识树高效学习:系统学习总......
  • Boundary Value Problem(OBVP) 问题在路径规划问题中的应用以及求解方法
    BVP问题常见的BVP问题通常具有如下特点BVP是状态栅格采样算法(statesampledlatticeplanning)的基础。没有通用的解,一般都是casebycase的设计。通常是一个复......
  • 室内单目深度估计-4
    1.论文简介论文题目:TowardPracticalMonocularIndoorDepthEstimationPaper地址:https://openaccess.thecvf.com/content/CVPR2022/papers/Wu_Toward_Practical_Monoc......
  • win强制修改盘符导致oracle异常恢复----惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:win强制修改盘符导致oracle异常恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责......
  • 今日报告-06
    今日打卡所花时间(包括上课):7h代码量(行):600发表博客:3篇(不包括本篇)了解到的知识点:Android:  安卓实现连接数据库并在应用页面向数据库中添加数据,相对布局的实际使用......
  • 1.【go-kit教程】go-kit初识
    go-kit简介go-kit本身不是一个框架,而是一套微服务工具集,是框架的底层,可以用go-kit做适应自己平台的框架。它的设计目标是帮助开发者构建健壮、可维护、可测试的分布式......
  • 9.【go-kit教程】go-kit集成Prometheus
    在Gokit中集成Prometheus进行API监控可以帮助开发人员更好地了解系统的性能和行为,提高系统的可观察性和可靠性。下面是一个简单的示例,演示如何在Gokit中集成P......