【多态】10分钟大白话讲解Java中的多态

1.多态的概念

多态(polymorphism)本来是生物学里的概念,表示地球上的生物在形态和状态方面的多样性。
而在java的面向对象中,多态通俗点说就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。也就是说,在父类中定义的属性和方法,在子类继承后,可以有不同的数据类型或表现出不同的行为。这可以使得同一个属性或方法,在父类及其各个子类中,可能会有不同的表现或含义。比如针对同一个接口,我们使用不同的实例对象可能会有不同的操作,同一事件发生在不同的实例对象上会产生不同的结果。

看到这里,其实有一部分人已经懂了,因为他们在看我这篇文章之前,也看过很多不同的文章。如果你是这部分人,那么你们可以离开了,因为接下来我讲的是对上面概念的解释。我相信有一部分人还是不太懂。别慌,继续看下面,可以来帮助大家理解。

2.多态的作用

(1)灵活性和可扩展性:多态性使得代码更加灵活和可扩展。通过使用多态性,我们可以编写通用的代码,可以处理不同类型的对象而无需针对每种对象编写特定的代码。这使得程序更加灵活,可以方便地添加新的对象类型或修改现有的对象类型,而不需要修改大量的代码。

(2)代码重用:多态性促进了代码的重用。通过将共享的行为抽象为接口或父类,并在具体的子类中实现特定的行为,我们可以在不同的对象上重用相同的代码。这减少了重复编写代码的工作量,提高了代码的可维护性和可读性。

(3)统一的接口:多态性提供了一种统一的接口来处理不同类型的对象。通过针对共同的基类或接口进行编程,我们可以使用相同的方法名来执行不同对象的操作。这使得代码更加整洁和一致,增加了代码的可读性和可理解性。

(4)扩展性和可维护性:通过多态性,我们可以轻松地扩展和修改现有的代码,而无需对现有代码进行大规模的修改。我们可以通过添加新的子类来增加新的功能,而无需改变现有的代码。这样可以减少潜在的错误和影响,并提高代码的可维护性。

(5)代码组织和管理:多态性有助于更好地组织和管理代码。通过将具有相似行为的对象归类为共同的类型,并使用多态性来处理它们,可以使代码更加结构化和模块化。这样可以提高代码的可读性和可维护性,并使开发过程更加高效。

3.多态的特性

根据多态的要求,Java对象的类型可以分为编译类型和运行类型,多态有如下特性:
(1)一个对象的编译类型与运行类型可以不一致;
(2)编译类型在定义对象时就确定了,不能改变,而运行类型却是可以变化的;
(3)编译类型取决于定义对象时 =号的左边,运行类型取决于 =号的右边所以我们在使用多态方式调用方法时,首先会检查父类中是否有该方法,如果没有,则会产生编译错误;如果有,再去调用子类中的同名方法。即编译时取决于父类,运行时取决于子类。

4.多态的必要性

我们要想实现多态,需要满足3个必要条件:
(1)继承:多态发生在继承关系中,必须存在有继承关系的父类和子类中,多态建立在封装和继承的基础之上;
(2)重写:必须要有方法的重写,子类对父类的某些方法重新定义;
(3)向上转型:就是要将父类引用指向子类对象,只有这样该引用才既能调用父类的方法,又能调用子类的方法。只有满足了以上3个条件才能实现多态,开发人员也才能在同一个继承结构中,使用统一的代码实现来处理不同的对象,从而执行不同的行为。


5.描述多态很形象的一张图片

6.总结

多态指的是不同子类型的对象,对同一行为作出的不同响应;
● 实现多态要满足继承、重新、向上转型的条件;
● 多态分为编译时多态和运行时多态,我们常说的多态是指运行时多态;
● 方法重载是编译时多态,方法重写是运行时多态;
● 父类引用指向子类对象时,调用的实例方法是子类重写的方法,父类引用不能调用子类新增的方法和子类特有属性;
● 多态使得代码更加灵活,方便了代码扩展。

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

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

相关文章

先进计算产业促湖南数字经济规模突破1.7万亿元

中新网湖南新闻1月26日电 (于冬阳 周沁怡)“截至2023年底,集群汇聚了中电长城、飞腾、麒麟等1400余家企业,产值达1800亿元。”1月26日,国家新一代自主安全计算系统产业集年度工作推进会在长沙举行,国家新一代自主安全计算系统产业…

python-分享篇-使用海龟turtle模块实现幸福大转盘

文章目录 准备代码效果 准备 一、根目录下放图片 代码 from turtle import * import turtle from random import randint import sys #屏幕初始化 screen turtle.Screen() screen.title("幸运大转盘 转转转~") screen.setup(480,450) screen.bgpic("转盘.png…

Android底部导航栏创建——ViewPager + RadioGroup

Android底部导航栏有多种实现方式,本文详解其中的ViewPager RadioGroup方式的实现步骤。 我们先来看以下看一下最终做出的效果,使大家有个基本概念。 本结构特点: 1,ViewPager部分触摸左右滑动切换页面,RadioGroup部…

怎么获取二维码的链接?二维码转链接只需3步

怎么从二维码中提取内容呢?现在很多内容都会用二维码方式来存储,但是有些场景下二维码是无法使用的时候,想要查看二维码中的内容,就需要分解二维码成链接后使用。那么二维码分解成链接具体该怎么做呢?今天就将在线二维…

计算机组成原理--4.指令系统

一.指令格式 二.指令分类

【笔记】顺利通过EMC试验(16-41)-视频笔记

目录 视频链接 P1:电子设备中有哪些主要骚扰源 P2:怎样减小DC模块的骚扰 P3:PCB上的辐射源究竟在哪里 P4:怎样控制PCB板的电磁辐射 P5:多层线路板是解决电磁兼容问题的简单方法 P6:怎样处理地线上的裂缝 P7:怎样降低时钟信号的辐射 P8:为什么IO接口的处理特别重要 P9…

数据结构——用链表实现Map

目录 一、映射(Map) 二、代码实现 1.建立接口 2.方法实现 (1)映射的建立 键(key)和值(val)的建立 重写toString方法 (2)构造方法 (3&…

102.乐理基础-五线谱-高音谱号

内容参考于:三分钟音乐社 上一个内容:五线谱的构造、谱号是什么-CSDN博客 谱号一共需要学习和了解四种,如下图:要牢牢掌握的是高音谱号和低音谱号这两种,如图1所示 首先高音谱号: 它大致范围,…

Vue3中的ref和shallowRef、reactive和shallowReactive

一:ref、reactive简介 ref和reactive是Vue3中定义响应式数据的一种方式。ref通常用来定义基础类型数据。reactive通常用来定义复杂类型数据。 二、shallowRef、shallowReactive简介 shallowRef和shallowReactive是Vue3中定义浅层次响应式数据的方式 三、Api使用对比…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 (1)官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines(2)Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

ansible处理多台机器部署基础环境

本次以多台机器需部署zabbix客户端为例: 机器先做免密互信,ansible主机上执行ssh-keygen,一路回车,然后将公钥发送给需管理的主机: ssh-copy-id rootIP 1、编辑hosts文件,添加需配置的主机IP,并测试连通…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践

背景:在某个嵌入式上的图像处理项目功能开发告一段落,进入性能优化阶段。尝试从多线程上对图像处理过程进行加速。经过初步调研后,可以从OPENMP,TBB这两块进行加速,当前项目中有些算法已采用多线程加速,这次…

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

如何用甘特图跟踪项目进度

甘特图是一个简单但是极其强大的项目管理工具,能够清晰可视化复杂项目的进度,在项目跟踪和控制上发挥重要作用。任何一个严肃的项目组织者都会使用甘特图来规划和管理项目中的任务。 甘特图的纵坐标表示项目的各项活动或任务,横坐标表示项目的时间进度。每个任务用一条横条表示…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

LLM应用开发与落地:基于上下文的文本信息检测与提取

最近一直用LLM解决各种各样的问题&#xff0c;感觉已经脱离不了LLM了。每次使用LLM解决一个之前解决不了的问题&#xff0c;或者大大提升我的工作效率的时候&#xff0c;我内心都小小会激动一下。我想这是只通过看文章或只是研究AI理论感受不到的小确幸。我也因此更加确信LLM是…

Kotlin MultiPlatform:构建跨平台应用的未来

Kotlin MultiPlatform&#xff1a;构建跨平台应用的未来 1 引言 1.1 Kotlin MultiPlatform简介 Kotlin MultiPlatform&#xff08;简称KMP&#xff09;是一种由JetBrains开发的跨平台开发解决方案&#xff0c;它建立在Kotlin语言之上。KMP允许开发者使用一套Kotlin代码来构建…

【2024】Docker部署Redis

1.说明&#xff1a; 因为容器实例的运行是有生命周期的&#xff0c;一些redis的备份、日志和配置文件什么的最好还是放在服务器本地。这样当容器删除时&#xff0c;我们也可以保留备份和日志文件。所以先在本地服务器安装redis并配置文件设置。下面是安装步骤: 2.安装步骤 1…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

Android源码设计模式解析与实战第2版笔记(二)

第二章 应用最广的模式 — 单例模式 单例模式的定义 确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式的使用场景 确保某个类有且只有一个对象的场景&#xff0c;避免产生多个对象消耗过多的资源&#xff0c;或者某种类型的对象只应…