【JAVA】多态的概念与实际利用

2023-09-19 19:53:25

在这里插入图片描述


个人主页:【😊个人主页】
系列专栏:【❤️初识JAVA】


前言

在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。在今天,我们就来学习一下JAVA中的多态是什么样子的。、
在这里插入图片描述

多态

指一个对象在不同情况下可以表现出不同的行为。Java多态性分为两种:编译时多态性(静态多态性)和运行时多态性(动态多态性)。

编译时多态性:也称为静态多态性,是指在编译期间就能确定方法的调用方式、参数类型及返回值类型等,主要通过方法重载实现。
运行时多态性:也称为动态多态性,是指在运行期间才能确定方法的调用方式,主要通过方法重写实现。Java中实现运行时多态性的关键是继承和方法重写。

具体来说,当一个类的子类重新定义了一个或多个已在父类中定义的方法时,那么子类的对象将可以调用重新定义的方法,而不是调用父类中的方法。这种现象称为方法重写。当通过父类的引用变量来引用一个子类的对象时,父类引用变量不能直接调用子类中重新定义的方法,而是要调用子类中的方法,这种多态性称为动态多态性。

多态实现的重要条件

Java多态实现的重要条件包括:

  1. 继承必须有继承关系,子类必须继承父类
  2. 覆盖:子类必须重写父类的方法
  3. 向上转型:可以声明一个父类引用类型的变量,将它指向一个子类对象。通过这种方式调用方法,就可以实现多态。
  4. 动态绑定:在运行时而不是编译时进行方法调用。这样就能够根据实际调用的对象类型来决定调用哪个方法,实现多态。

虚函数

在Java中,所有方法都是虚函数,因为它们都是在运行时动态绑定的。当子类继承父类时,它可以覆盖父类的方法,但具体调用哪个方法取决于对象的实际类型而不是变量的声明类型。因此,可以在运行时动态处理对象的多态性。

使用关键字“override”来覆盖父类的方法。子类中的方法必须与父类中被覆盖的方法具有相同的名称、参数列表和返回类型。这样,当调用子类中的方法时,根据对象的类型来确定应该调用哪个方法。

实例

假设我们有一个Animal类和一个Cat类,Cat类是Animal类的子类。

Animal类中定义了一个虚方法makeSound(),它会输出动物发出的声音:

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

Cat类继承了Animal类并覆盖了makeSound()方法:

public class Cat extends Animal {
    public void makeSound() {
        System.out.println("The cat meows");
    }
}

现在,我们可以实例化一个Animal对象和一个Cat对象,并调用它们makeSound()方法:

Animal animal = new Animal();
Cat cat = new Cat();

animal.makeSound(); // 输出 "The animal makes a sound"
cat.makeSound(); // 输出 "The cat meows"

注意,由于Cat类继承了Animal类,因此可以使用Cat对象来代替Animal对象,因为它们都是Animal类的实例。这就是面向对象编程中的多态性。

多态的实现方式

方式一:重写:
这个内容已经在上一篇文章中我有详细的讲过Java 重写(Override)与重载(Overload)
方式二:接口

  1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。

  2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。

方式三:抽象类和抽象方法

更多推荐

掌握Linux服务器管理技巧与容器化应用 - 从软件服务到虚拟化技术全面解析

文章目录一.Linux软件和服务1.软件包管理和软件更新1.1APT(AdvancedPackageTool)的使用1.2Yum包管理器的使用2.操作系统升级2.1Debian/Ubuntu系统的升级2.2RedHat/CentOS系统的升级二.Linux服务的安装和配置1.Apache服务器的安装和配置步骤1:安装A

使用亚马逊云科技Amazon SageMaker,为营销活动制作广告素材

广告公司可以使用生成式人工智能和文字转图像根基模型,制作创新的广告素材和内容。在本篇文案中,将演示如何使用亚马逊云科技AmazonSageMaker从现有的基本图像生成新图像,这是一项完全托管式服务,用于大规模构建、训练和部署机器学习模型。采用此解决方案,企业无论规模如何,都可以比以往更快地制作新的广告素材,而且大幅降

Linux应用编程--IO文件

【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.1.pdf(gitee.com)1.基本概述1.什么是Linux应用程序(1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机,c高级,uboot和系统移植,linux应用编程和网络编程,驱动(2)典型的嵌入式产品就是基于嵌入式linux操作系

从零学习开发一个RISC-V操作系统(二)丨GCC编译器和ELF格式

本篇文章的内容一、GCC(GUNCompilerCollection)1.1GCC的命令格式1.2GCC的主要执行步骤1.3GCC涉及的文件类型二、ELF简介2.1ELF文件格式图2.2ELF文件处理的相关工具2.3练习本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记,计划从RISC-V的底层汇编指

MySQL多表查询

浅记sql中多表查询的相关语法笛卡尔积单表查询:select*fromtable1;多表查询:select*fromtable1,table2;idnameagestatusgenderiddes1张三221男3禁止1张三221男2受限1张三221男1正常2李四121女3禁止2李四121女2受限2李四121女1正常3王

无需申请专线、无需改动网络,ERP/MES管理系统如何远程访问?

深圳市某模具公司作为一家以设计、制作五金模具、五金冲压、机加工件、加工经营为主的五金企业。为了实现更为高效的生产管理流程,引入了面向钣金/五金行业信息化建设的ERP/MES管理系统及方案,并将其部署在了企业总部的内网服务器。除了总部访问需求外,该企业还在异地设有两座工厂,同样需要使用这套生产管理系统,但是受限于网络,两

typescrip接口 interface详解,以及ts实现多态

ts接口当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的示例如下当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余letpersonTom:{name:string,age?:number,sayHi(name:string):void}={name:'Tom'

【数据结构】二叉树的链式实现及遍历

文章目录一、二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历二、二叉树结点个数及高度1、二叉树节点个数2、二叉树叶子节点个数3、二叉树第k层节点个数4、二叉树查找值为x的节点三、二叉树创建及销毁1、通过前序遍历数组创建二叉树2、二叉树的销毁3、判断是否为完全二叉树四、测试代码一、二叉树的遍历后文所有代码中的

MongoDB 是什么和使用场景概述(技术选型)

一、从NOSQL(NotOnlySQL)说起常见的数据库可以分为下面的两种类型:RDBMS(关系型数据库):常见的关系型数据库有Oracle、DB2、MicrosoftSQLServer、MicrosoftAccess、MySQL;NoSQL(非关系型数据库):常见的非关系型数据库有MongoDB、Redis、Vold

基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

python入门篇09- 文件操作,函数, 包及模块的综合案例

全文目录,一步到位1.前言简介1.1专栏传送门2.前文知识梳理3.前文总结案例3.1案例介绍3.1.0案例包结构3.1.1案例拆解3.1.2案例操作效果如图所示:文字形式(直观展示)3.2代码实现3.2.1工具包一:file_util.py3.2.2工具包二:string_util.py3.2.3导入控制:__init

热文推荐