多态实现原理

news2025/1/12 12:23:20

学习Java的时候就已经学习了多态但是对于多态的原理还是不是很明白所以写下这篇文章来记录一下
如果后面有新的理解也继续添加到本页面

什么是多态

多态是面向对象编程里面的概念,一个接口的多种实现不同的实现方式,即为多态
这里的接口不应理解得太死板,比如在 Java 里面,继承一个类和实现一个接口本质上都是一种继承行为,因此都可以理解为多态的体现。

从静态和动态的角度进行划分,多态可以分为 编译时多态运行时多态

编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法,编译之后会变成两个不同的方法。

而运行时多态是动态的,是通过动态绑定来实现的,也就是大家通常所说的多态性,本篇博客主要讨论运行时多态。

多态的特点

多态的特点为:只有在运行的时候才知道引用指向的是哪个类的实例对象,以及引用调用的方法指向的是哪个类中实现的方法。
多态通常有两种实现方法:

  • 子类继承父类(extends)
  • 类实现接口(implements)

多态核心之处就在于对父类方法的重写或对接口方法的实现,以此在运行时实现不同的执行效果

多态的原理

RTTI,即Run-Time Type Identification运行时类型认定,通过运行时类型信息程序能够使用父类的指针或引用来检查这些指针或引用所指的对象的实际派生类型,是多态实现的技术基础。RTTI的功能主要是通过Class类文件实现的,更精确一点是通过Class类文件的方法表实现的。

Class类是"类的类"(class of classes)。如果说类是对象的抽象的话,那么Class类就是对类的抽象。Class对象就是用来创建一个类的所有的常规对象的。每个类都有一个Class对象,每当编写好并且编译了一个新的类,就会生成一个它对应的Class对象,被保存在一个与类同名的.class文件中。java虚拟机中的被称为类加载器的子系统,就是专门拿来做生成这个类的Class对象的工作的。

public class TT {
    public static void main(String[] args) {
        P p1 = new Man("男孩");
        System.out.println(p1.getClass().getName());
        P p2 = new WoMan("女孩");
        System.out.println(p2.getClass().getName());
    }
}
class P{
    String name;
    public P(String name){
        this.name = name;
    }
    public void say(){
        System.out.println(name+"is runing");
    }
}
class Man extends P{
    String name;
    public Man(String name) {
        super(name);
        this.name = name;
    }
}

class WoMan extends P{
    String name;
    public WoMan(String name) {
        super(name);
        this.name = name;
    }
}

在这里插入图片描述
可以发现即使我们将对象的引用向上转型,对象所指向的Class类对象依然是实际的实现类。

Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。这意味着java在运行时的确能确定真正的实现类是哪一个。

可以发现,就算是这种起始这个也是保持的是自己的字节码对象而不是父类的字节码

在这里插入图片描述

假如子类在重写了父类的方法那么会在链接的解析阶段将父类中方法的引用指向子类中重写的方法

多态方法调用

在调用方法时,首先需要完成实例方法的符号引用解析,也就是将符号引用解析为方法表的偏移量。

虚拟机通过对象引用得到方法区中类型信息的入口,查询类的方法表,当将子类对象声明为父类类型时,形式上调用的是父类方法;

此时虚拟机会从实际类的方法表(虽然声明的是父类,但是实际上这里的类型信息中存放的是子类的信息)中根据偏移量获取该方法名对应的指针,进而就能指向实际类的方法了。

上面我们讨论的仅是利用继承实现多态的内部机制,多态的另外一种实现方式:接口实现相比而言会更加复杂。原因在于,Java的单继承保证了类的线性关系,而接口可以同时实现多个,这样光凭偏移量就很难准确获得方法的指针。

所以在 JVM 中,多态的实例方法调用实际上有两种指令:

invokevirtual 指令:用于调用声明为类的方法;

invokeinterface 指令:用于调用声明为接口的方法。

当使用 invokeinterface 指令调用方法时,就不能采用固定偏移量的办法了。实际上,Java 虚拟机对于接口方法的调用是采用搜索方法表的方式来实现的,比如,要在 Father 接口的方法表中找到 dealHouse() 方法,必须搜索 Father 的整个方法表。所以我们可以得出,在性能上,调用接口引用的方法通常总是比调用类的引用的方法要慢。这也告诉我们,在类和接口之间优先选择接口作为设计并不总是正确的。

以上就是多态的原理,总结起来说就是两点:

  1. 方法表起了决定性作用,如果子类改写了父类的方法,那么子类和父类的同名方法共享一个方法表项,都被认作是父类的方法,因此可以写成父类引用指向子类对象的形式。

  2. 类和接口的多态实现不一样,类的方法表可以使用固定偏移,但接口需要进行搜索,原因是接口的实现不是确定唯一的,所以相对来说性能差一些。

在这里插入图片描述

因为接口的实现不是唯一的,所以性能会低一点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国考省考行测:关联词分析法,转折,总结,条件,递进,并列,各种关联词的典型词语和重点在哪

国考省考行测:关联词分析法,转折,总结,条件,递进,并列,各种关联词的典型词语和重点在哪 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论&a…

Twitter营销你需要做的细节

优化首页 1. 塑造品牌形象 品牌对于企业来说是一种无形的价值,所以在任何平台上都要注意加深品牌印象,在推特上也是一样的,比如一样的logo,让访问过你网站的人一眼就认出你来。这样,品牌的不断深入,才能让…

如何用mac搭建本地svn服务器(如何将mac变成版本管理服务器)

前言 一、搭建本地svn服务器 1.建立代码库 2.配置文件修改 3.启动本地svn服务 二、搭建过程中常见问题 如果Mac os升级到10.0以上,自带的svn不支持了怎么办 三、mac本地使用svn软件管理svn库 cornerstone3安装 四、使用Cornerstone会存在的问题 Mac打开应用提示已损…

硬件 RAID 与软件 RAID 之间的区别

独立磁盘冗余阵列 (RAID) 是一种将多个物理驱动器组合到一个单元中的虚拟磁盘技术。这是一种通过使用多个驱动器来提高存储介质的性能和可靠性的方法。驱动器配置为在磁盘之间划分数据以分配负载,或者复制数据以确保在磁盘发生故障后可以恢复…

Oauth2.0实现单点登录的原理流程,这次总该懂了!

单点登录是多域名企业站点流行的登录方式。本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程。同时总结了权限控制的实现方案,及其在微服务架构中的应用。 1 什么是单点登录 1.1 多点登录 传统的多点登录系统中,…

正大国际期货:外盘期货恒指八大交易法则!

现在比较流行的期货并不算多,主流的就是恒指期货、美原油期货和黄金期货还有德指期货、道指、铜、天然气等等,恒指期货是最适合亚洲人投资的期货品种,现在国内很多投资人也会选择恒指期货入手。那么投资者要遵循哪些法则才可能在期货市场中获…

安装虚拟机以及linux(Centos 7)系统

背景:模拟部署系统至Linux服务器上并运行 下载VMware Workstation Pro并激活,自行百度下载。 打开虚拟机“创建新的虚拟机” 然后选择自定义,选择好后点击下一步 直接下一步 稍后安装操作系统 客户机操作系统选择Linux,版本选择…

element集成第三方icon图标

引言 集成阿里图标库 进入阿里icon,新建项目 选择一个自己喜欢的icon库,将里面的图标加入购物车中 因为没有批量导入购物车,所以一般情况下需要一个一个去点,太浪费时间,那么请在控制台输入以下代码,批量…

Spring 中 @Bean 注解流程分析

代码案例 现在 SpringBoot、SpringCloud 基本上都是通过 Bean 注解来将组件交给 Spring 管理,所以对 Bean 的流程应该要有所了解。 这里先定义一个 Blue 的实体类,如下: public class Blue { }然后定义一个入口类,通过 Bean 注…

rocketMq介绍和安装

rocketMq介绍和安装 Mq介绍 MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。 QQ和微信就是典型的MQ。 MQ的作用 主要有以下三个…

天翼物联2项成果成功入选“工信部2022年移动物联网应用典型案例库”

近日,工信部公布了2022年移动物联网应用典型案例征集活动入库案例名单,天翼物联牵头申报的“智慧农业——水肥一体化物联网项目”、“智能表计——抄表机器人物联网项目”成功入选。 本次典型应用案例征集由工业和信息化部组织开展,征集范围包…

产品结构设计的技巧和规则?

说到产品,产品结构设计在当今时代非常重要。它不仅感受到用户的青睐,而且影响销售,因此每个人都非常重视产品结构设计。那你知道产品结构设计的技巧和规则吗? 一、选材方面: 1.耐温等塑料制品的使用环境.耐寒.食品卫生.耐磨等; 2…

resnet(3)------卷积层与激活函数与池化层

文章目录一. 卷积层二. 激活函数1. Sigmoid函数2. tanh函数3. Relu函数三. 池化层一. 卷积层 上一篇文章我们讲到过可以通过控制卷积层的个数来提取图像的不同特征,但是事实上卷积是一种线性运算,更准确的说是一种线性加权运算,而线性运算是…

web课程设计网页规划与设计——惊奇漫画网站

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

基于蚁群优化算法的直流电机模糊PID控制(Matlab实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

基于jsp+mysql+ssm电影视频预约推荐系统-计算机毕业设计

项目介绍 本基于SSM框架的电影预约推荐系统主要包含了等系统用户管理、影视分类管理、电影预约信息管理、预约信息审核管理多个功能模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统是独立的运行,不依附于其他系统,可移植&…

MaxSite CMS 代码问题漏洞(CVE-2022-25411)

0x01 漏洞介绍 MaxSite CMS是俄国MaxSite CMS开源项目的一款网站内容管理系统。Maxsite CMS存在代码问题漏洞,该漏洞允许攻击者可利用该漏洞通过精心制作的PHP文件执行任意代码。漏洞在/admin/options 处的远程代码执行 (RCE) 漏洞允许攻击者通过构建的 PHP 文件执行任意代码…

能源管理系统主要功能|智慧工厂|瑜岿科技

瑜岿科技综合能源管理系统以物联网LoT平台为底座,并发挥其数据融合和系统集成能力,不断完善和扩充在数字化运维场景下的功能库,系统升级后具有智慧能效、智慧运维、需求响应、碳中和、资产管理、数字展示大屏等功能模块,现可将水、…

【ARM-Trustzone-TEE-ATF-SOC群】周刊 第一期:开篇

背景 很多小伙伴也都知道,学习/探讨Arm/安全/tee是有群的,而且不止一个。在此群中,有很多很多优秀的小伙伴,每天讨论着各种各样的技术,透过事务看本质,直奔主题的讨论。这里聚集着一些SOC大牛、ASIC大牛、…

营销革命5.0—用技术手段推动市场部变革

随着政治、经济、社会环境和消费者的需求与行为的改变,以及日新月异的技术进步,营销的思想和模式在不断迭代。科特勒教授将营销的演进划分为5个阶段: 第一个阶段是营销1.0时代,工业化时代以产品为中心的营销,解决企业…