Java(七)——多态

个人简介

👀个人主页: 前端杂货铺
开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL)
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍖开源 rich-vue3 🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Java基础(一)Hello World,8种数据类型,键盘录入
Java基础(二)数组,方法,方法重载
Java基础(三)类和对象、构造方法
Java基础(四)字符串、StringBuffer、StringBuilder、StringJoiner
Java基础(五)ArrayList
Java基础(六)继承

文章目录

    • 前言
    • 多态
    • 多态调用成员的特点
    • 多态的优势与弊端
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章,我们学习多态、多态调用成员的特点以及认识其优势与弊端。


多态

多态:同类型的对象,表现出的形态不同。

多态的表现形式:父类类型 对象名称 = 子类对象。Fu f = new Zi()

多态的前提:有继承关系、有父类引用指向子类对象、有方法重写。

多态的好处:使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

假如我们现在有一个教务系统,存在管理员、老师、学生三种身份,我们通过类来打印他们各自的信息,我们要怎么设计呢?

Test.java

package com.javabasic.polymorphism;public class Test {public static void main(String[] args) {// 创建三个对象,并调用register方法Student student = new Student();student.setName("前端杂货铺");student.setAge(20);Teacher teacher = new Teacher();teacher.setName("张三");teacher.setAge(30);Admin admin = new Admin();admin.setName("管理员");admin.setAge(25);register(student);register(teacher);register(admin);}// 此方法既能接收老师,又能接收学生,还能接收管理员// 只能把参数写成这三个类型的父类public static void register(Person p) {p.show();}
}

Person 父类,用于显示子类对象实例的信息。

Person.java

package com.javabasic.polymorphism;public class Admin extends Person {@Overridepublic void show() {System.out.println("管理员的信息:" + getName() + ", " + getAge());}
}

Person 的子类 Admin,打印管理员的信息。

Admin.java

package com.javabasic.polymorphism;public class Admin extends Person {@Overridepublic void show() {System.out.println("管理员的信息:" + getName() + ", " + getAge());}
}

Person 的子类 Teacher,打印老师的信息。

Teacher.java

package com.javabasic.polymorphism;public class Teacher extends Person {@Overridepublic void show() {System.out.println("老师的信息:" + getName() + ", " + getAge());}
}

Person 的子类 Student,打印学生的信息。

Student.java

package com.javabasic.polymorphism;public class Student extends Person {@Overridepublic void show() {System.out.println("学生的信息:" + getName() + ", " + getAge());}
}

在这里插入图片描述


多态调用成员的特点

两句话:

  1. 调用成员变量的特点:编译看左边,运行也看左边
  2. 调用成员方法的特点:编译看左边,运行看右边

成员变量:在子类的对象中,会把父类的成员变量也继承下来。
成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。

接下来,我们进行调用成员变量和成员方法的测试:

package com.javabasic.demo;public class Test {public static void main(String[] args) {Animal animal = new Dog();// 调用成员变量:编译看左边,运行也看左边// 编译看左边:javac 编译代码时,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败// 运行也看左边:java 运行代码时,实际获取的就是左边父类中成员变量的值System.out.println(animal.name); // animal// 调用成员方法:编译看左边,运行看右边// 编译看左边:javac编译代码时,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败// 运行看右边:java运行代码时,实际上运行的是子类中的方法animal.show(); // dog --- show方法}
}class Animal {String name = "animal";public void show() {System.out.println("Animal --- show方法");}
}class Dog extends Animal {String name = "dog";@Overridepublic void show() {System.out.println("dog --- show方法");}
}class Cat extends Animal {String name = "cat";@Overridepublic void show() {System.out.println("cat --- show方法");}
}

在这里插入图片描述


多态的优势与弊端

优势:方法中,使用父类型作为参数,可以接受所有子类对象。

弊端:不能使用子类的特有功能。

如果我们就是要调用子类中特有的功能该如何是好呢?—— 类型转换

package com.javabasic.demo;public class Test {public static void main(String[] args) {Animal animal = new Dog();// 会报错,因为 animal 中不存在 eat()// animal.eat();// 解决方案:进行类型转换if (animal instanceof Dog dog) {dog.eat();} else if (animal instanceof Cat cat) {cat.sleep();} else {System.out.println("没有这个类型,无法转换");}}
}class Animal {String name = "animal";public void show() {System.out.println("Animal --- show方法");}
}class Dog extends Animal {String name = "dog";@Overridepublic void show() {System.out.println("dog --- show方法");}public void eat() {System.out.println("dog --- 啃骨头");}
}class Cat extends Animal {String name = "cat";@Overridepublic void show() {System.out.println("cat --- show方法");}public void sleep() {System.out.println("cat --- sleep");}
}

在这里插入图片描述


总结

本篇文章,我们学习了多态的相关内容,并认识了多态调用成员的特点及多态的优势与弊端…

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Java 基础(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


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

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

相关文章

Qt | QPen 类(画笔)

01、画笔基础 1、需要使用到的 QPainter 类中的函数原型如下: void setPen(const QPen &pen); //设置画笔,void setPen(const QColor &color); //设置画笔,该笔样式为 Qt::SolidLine、宽度为 1,颜色由 color 指定void setPen(Qt::PenStyle style); //设置画笔,该…

什么是SysTick?

一,滴答定时器SysTick SysTick,即滴答定时器,是内核中一个特殊的定时器,用于提供系统级的定时服务。是一个24位递减计时器,具有自动重载值寄存器的功能 。当计数器到达自动重载值时,它会自动重新加载新的计…

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言 1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化,实现事务的隔离性,也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离性等级 2、通常用隔离级别来描述隔离性等级,以下将主要介绍ANSI 92标准…

上新:NFTScan 正式上线 Bitcoin-Runes 浏览器!

近日,NFTScan 团队正式对外发布了 Bitcoin-Runes 浏览器,将为 Runes 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。Runes 协议的主要目的是定义一种在比特币网络上进行符号化资产交换的方式。它使用 Rune 作为符号化资产的单位&#xf…

【昇思25天学习打卡营打卡指南-第十九天】基于MobileNetv2的垃圾分类

CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习…

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT(Bidirectional Encoder Representations from Transformers)是谷歌提出,作为一个Word2Vec的替代者,其在NLP领域的11个方向大幅刷新了精度,可以说是近年来自残差网络最优突破性的…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

算法mq 交互通用校验模块设计

背景 当前与算法交互均通过rocketMQ异步交互,绝大部分场景一条请求mq消息应对应一条返回mq,但由于各种原因(消息积压、程序bug),可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过…

基础权限存储

一丶要求 建立用户组shengcan,其id为 2000建立用户组 caiwu,其id 为2001建立用户组 jishu,其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录,只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息(没有特殊配置的情况下默认直接用全局信息) 特定仓库用户信息(只针对于当前项目) 方法一:修改config文件 方法二:命令方式 2、idea同一代码推向多个远端仓库…

Ubuntu编译 OSG

目录 一、安装步骤 二、配置 1、数据文件配置 2、OSG环境变量配置 一、安装步骤 在Ubuntu上安装OSG(OpenSceneGraph),你可以按照以下步骤操作: 打开终端,更新你的包管理器的包列表: sudo apt update 安装必要的依赖库 sudo apt install libglu1-mesa-dev freeglu…

Java -- 实现MD5加密/加盐

目录 1. 加密的引出2. MD5介绍3. 解决MD5不可解密方法4. 实现加密解密4.1 加密4.2 验证密码 1. 加密的引出 在MySQL数据库中,一般都需要把密码、身份证、电话号码等信息进行加密,以确保数据的安全性。如果使用明文来存储,当数据库被入侵的时…

第七篇——攻谋篇:兵法第一原则——兵力原则,以多胜少

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 微观层面上,也有很多值得深度思考的问题 二、思路&方案 …

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

MuLan:模仿人类画家的多对象图像生成

在图像生成领域,处理包含多个对象及其空间关系、相对大小、重叠和属性绑定的复杂提示时,现有的文本到图像模型仍面临挑战:当文本提示中包含多个对象,并且这些对象之间存在特定的空间关系时,现有模型往往难以准确地捕捉…

嵌入式c语言4——类型修饰符

register,将变量保存在寄存器中,使得访问速度增加 const是常量,static是静态量,volatile是

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架? 脚手架本质就是一个工具,作用是能够让使用者专注于写代码,它可以让我们只用一个命令就生成一个已经配置好的项目,而不用我们再花时间去配置和安…

zabbix 与 grafana 对接

一.安装 grafana 1.初始化操作 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled 2.上传数据包并安装 cd /opt grafana-enterprise-9.4.7-1.x86_64.rpm #上传软件包 yum localinstall -y grafana-enterprise-9.4.7-1…

Javascript常见数据结构和设计模式

在JavaScript中,常见的数据结构包括两大类:原始数据类型(Primitive Types)和对象类型(Object Types)。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

PyFluent入门之旅(4)算例求解

在网格划分完成或已有网格的情况下,可以进行算例的求解。 1. 切换/打开求解器 一般启动求解器前有两种情况: 已启动FluentMeshing并生成了网格,需要在不退出FluentMeshing的情况下直接切换至Fluent求解器。已经有现成的网格文件&#xff0…