【JAVA SE】多态

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:JAVA

个人主页:Celia's blog~

目录

引言

一、多态

1.1 多态的概念

1.2 多态的实现条件

1.3 关于向上转型、向下转型

1.4 关于重写

1.5 实现多态

1.6 多态的好处


引言

 上一个篇章中,我们已经初步了解了继承的概念以及使用,在本篇文章中,将会介绍在Java中依赖于继承的一种新的现象:多态。

一、多态

1.1 多态的概念

  多态,是指不同的对象,面对同一个事物时,会展现出不同的反应。

1.2 多态的实现条件

  1. 必须在继承体系下
  2. 子类必须重写父类的方法
  3. 通过父类的引用来调用重写的方法

1.3 关于向上转型、向下转型

  在继承体系中,如果创建了一个子类对象,是可以用父类类型来接收的。假设有如下代码:

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}

我们创建一个dog对象,是可以用Animal类型来接收的:

Animal animal = new Dog("小黑", 10);

那么为什么要这样做呢? 

父类的类型可以接收所有继承于这个父类的子类的对象,这有助于统一标准。此时这种情况就叫做向上转型。

向上转型的三种方式:

  1. 在创建新对象时用父类类型接收
  2. 利用传参,传入子类,用父类接收
  3. 利用方法返回值,返回子类,用父类接收

注意事项:

在继承过程中,如果实现了向上转型,该对象只能使用父类的成员变量或成员方法,这是由类型所局限的。

 

如果想要访问子类的成员变量和成员方法,则需要向下转型:

((Dog) animal).flag//向下转型访问子类成员

1.4 关于重写

  重写,也称为覆盖。是子类对父类的非静态、非private、非final、非构造方法进行的重新编写。返回值和形参列表(种类、顺序)必须一样。只有内容可以改变。我们来看下面的代码:

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}


public class Text {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑", 10);/向上转型
        animal.eat();//会输出什么呢???
    }
}


我们仔细观察,发现子类Dog和父类Animal都有一个相同的方法:eat,它们的返回值相同,参数列表相同,此时,子类中的eat方法就对父类中的eat方法进行了重写当我们调用父类的eat方法时,实际上调用的是子类的eat方法。


实际上,调用的确实是父类的eat方法,但是在程序运行的过程中,实际上调用的是子类的eat方法,这种在继承体系下,运行时才确定具体调用哪个方法的现象叫做动态绑定。

1.5 实现多态

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}

class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }
    public void eat() {
        System.out.println("正在吃猫粮...");
    }
}

public class Text {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑", 10);
        Animal animal1 = new Cat("小白",5);
        animal.eat();
        animal1.eat();
    }
}

在以上代码中,定义了两个子类Cat和Dog,进行向上转型,并且调用父类的eat方法:

此时,调用的都是父类的eat方法,但是根据子类对象的不同,实际上展现出来的表现也不同,这种现象就叫做多态。

1.6 多态的好处

  1. 避免使用大量的if-else语句:只需要调用父类的方法,根据对象的不同,就能实现不同的表现形式。
  2. 可扩展能力强:如果想要扩展,只需要定义一个新的继承该父类的类,并且重写父类的方法就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python魔法之旅-魔法方法(05)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

微信小程序-网络数据请求(配置request合法域名)

1.小程序中网络数据请求的限制 出于安全方面的考虑,小程序官方对数据接口的请求做出了如下两个限制: (1)只能请求HTTPS类型的接口 (2)必须将接口的域名添加到信任列表中 如果要请求某个域名下的接口&am…

微信小程序发送订阅消息

小程序后台。订阅消息里面,新建一个消息模板 小程序代码,登录后,弹出订阅信息 requestSubscribeMessage: function () {wx.requestSubscribeMessage({tmplIds: [-323232-32323], // 替换为你的模板IDsuccess(res) {// 用户订阅结果console.l…

优化CPU占用率及内存占用2

在标准化无线通信板时,关注过程序占用ram的问题,当时 发现每一个线程都会分配8M栈空间,这次换rk3568后,偶尔看了下RAM占用,吓了一跳,不但每个线程有8M栈空间,几乎每个线程都占用了64MB的一个RAM…

多态--5.30

理解: 就是引用多个方法类; 方法可以加参数; 多态为方法的多态; 主要代码: // animal an; // cat c new cat(); // anc; //三行代码等于animal an new cat();#前提是要有animal类&…

【C语言回顾】预处理

前言1. 简单概要2. 预处理命令讲解结语 上期回顾: 【C语言回顾】编译和链接 个人主页:C_GUIQU 归属专栏:【C语言学习】 前言 各位小伙伴大家好!上期小编给大家讲解了C语言中的编译和链接,接下来我们讲解一下预处理! …

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…

物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念(常用于输出PWM波形,驱动电机) 时间脉冲数时钟周期; 这里的脉冲数6553665536,支持定时器级联,从而延长定时 定时器类型 基本定时器原理图(UI:更新中断, U:更新事件&#…

Jmeter的线程组之间传递参数

使用jemter做接口测试,有时候需要会遇到不同线程组之间调用相同变量的情况,最多见的就是token的传递,网上有很多处理方法,这里只记录setProperty的办法,一招鲜走遍天! 首先我有两个线程组: 线程…

一种最大重叠离散小波包特征提取和支持向量机的ECG心电信号分类方法(MATLAB 2018)

目前小波分析算法常采用Mallat快速算法。该算法由与滤波器卷积、隔点采样和隔点插零等三个环节组成。由于实际使用的滤波器并不具有理想频域特性,使得在标准二进小波算法中存在着频率混叠和小波系数失真等缺点,在标准二进小波包算法中还存在频带错乱现象…

基于 Spring Boot 博客系统开发(十二)

基于 Spring Boot 博客系统开发(十二) 本系统是简易的个人博客系统开发,为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(十一)&…

热门新游 2024 植物大战僵尸杂交版 Mac 版本下载安装详细教程

最近植物大战僵尸杂交版可谓是非常的火,好多主播都在播这款游戏,我一个 Mac 党也想玩,可奈何该游戏目前只有 PC 版本,经过一番折腾终于在我的 Mac 上安装上了该游戏,分享给大家 其实安装过程也很简单,只需…

深度学习 --- stanford cs231 编程作业(如何在chrome中安装Google colab)

stanford cs231 编程作业(如何开始你的colab编程) 斯坦福231n的所有作业都要求在colab里面做,colab可以为你提供免费的云计算。实际上在他的官网中也有关于如何安装colab的详细说明视频。 https://youtu.be/DsGd2e9JNH4https://youtu.be/DsGd2e9JNH4 我这…

GPU学习(1)

一、为什么要GPU 我们先看一个基本的神经网络计算 YF(x)AxB 这就是一次乘法一次加法 ,也叫FMA,(fused multiply-add) 如果矩阵乘,就是上面的那个式子扩展一下,所以又用了这张老图 比如你要多执行好几个yAxB,可能比较简…

AI图书推荐:使用GitHub Copilot和ChatGPT辅助的Python编程

使用Python编写计算机程序变得更加简单了!使用像GitHub Copilot和ChatGPT这样的AI辅助编码工具,将你的想法快速转化为应用程序。人工智能已经改变了我们编写计算机程序的方式。有了像Copilot和ChatGPT这样的工具,你可以用简单的英语描述你想要…

【docker】Docker的基本指令和HTML/PYTHON/C++的简单创建示例

目录 🌊1. 什么是 Docker? 🌊2. Docker 安装 🌊3. Docker基本指令 🌊4. Docker 创建示例【联网情况】 🌍4.1 示例:HTML 🌍4.2 示例:Python 脚本 🌍4.3…

四信云-设备维保管理系统上线,实现设备全生命周期管理

在当今的制造业中,设备是企业生产的核心要素,是企业竞争力的基石。 随着企业发展规模不断扩大,设备数量急速增长,传统的手工管理方式已经无法满足企业需求,设备管理系统的出现则填补了市场需求空白,其目标…

5-21作业

流式域套接字 服务器端实现 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h> #include <…

【运维项目经历|015】:Nginx Web服务性能提升与优化项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的技术性问题 问题1&#xff1a;本次项目的人员配置&#xff1f; 问题2&#xff1a;本次项目的周期&am…

PX4使用yolo仿真环境搭建

文章目录 前言一、修改机架sdf文件二、安装yolo三、运行 前言 ubuntu20.04 PX4 1.13.3 已配置好PX4 ROS gazebo环境 一、修改机架sdf文件 将双目相机加到仿真的iris机架上 修改下图文件 添加如下&#xff1a; <include><uri>model://stereo_camera</uri>…