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,一经查实,立即删除!

相关文章

Fortigate 飞塔防火墙CLI – 概述

1,可以通过SSH, Telnet, 或者serial console2,CLI的配置是分级的结构,如下所示:config system interfaceedit "internal"set vdom "root"set ip 192.168.100.99 255.255.255.0set allowaccess p… 1&#xff…

Apipost接口测试工具的原理及应用详解(六)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为…

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位递减计时器,具有自动重载值寄存器的功能 。当计数器到达自动重载值时,它会自动重新加载新的计…

数学基础 -- 复合函数

函数的复合 函数复合是数学中的一个重要概念,指的是将一个函数的输出作为另一个函数的输入。具体来说,给定两个函数 f f f 和 g g g,函数 f f f 和 g g g 的复合记作 f ( g ( x ) ) f(g(x)) f(g(x)) 或 ( f ∘ g ) ( x ) (f \circ g)(…

掌握Vue插槽:创建灵活且可复用的组件

引言 插槽(Slots)是实现组件化的一个强大工具,它允许开发者在组件内部定义可替换的内容区域 插槽的主要作用包括: 内容分发:允许开发者在组件内部定义内容的“插槽”,然后在使用组件时,通过插…

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

一、引言 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 。该模型实现了一种在没有配对示例的情况下学习…

数据结构学习笔记-十大排序算法

1.插入排序 直接插入排序 //直接插入排序 void InsertSort(int A[], int n){int i,j,temp;for(i1;i<n;i) //将各元素插入已排好序的序列中if(A[i]<A[i-1]){ //若A[i]关键字小于前驱tempA[i]; //用temp暂存A[i]for(ji-1;j>0 && A[j]>temp;--j) …

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

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

从零搭建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异步交互&#xff0c;绝大部分场景一条请求mq消息应对应一条返回mq&#xff0c;但由于各种原因&#xff08;消息积压、程序bug&#xff09;&#xff0c;可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过…

MySql数据库常用指令合集

MySql数据库常用指令合集 一、创建数据库db11.创建表 字段---表头 student_no,username,sex2.新增单条插入多条插入3.删除4.更新5.查询5.1.查询该表全部信息5.2.查询该表中username&#xff0c;并且要求名字为zhangsan性别女&#xff0c;还可以用&#xff08;or&#xff09; 6.…

卷积神经网络有哪些应用场景

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;的应用场景非常广泛&#xff0c;尤其是在处理具有网格结构的数据&#xff08;如图像、视频&#xff09;时表现出色。以下是一些主要的应用场景&#xff1a; 1. 图像识别与分类 图像分类…

基础权限存储

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

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息&#xff08;没有特殊配置的情况下默认直接用全局信息&#xff09; 特定仓库用户信息&#xff08;只针对于当前项目&#xff09; 方法一&#xff1a;修改config文件 方法二&#xff1a;命令方式 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数据库中&#xff0c;一般都需要把密码、身份证、电话号码等信息进行加密&#xff0c;以确保数据的安全性。如果使用明文来存储&#xff0c;当数据库被入侵的时…

8.做pwn题的大致流程

file <文件名> 判断是32还是64位&#xff0c;用对应工具分析&#xff08;比如ida&#xff0c;可以直接把文件拖到对应图标上&#xff09; ida中如果没找到main函数就找start函数从而找到main函数起始地址 两种分析方式&#xff1a; 静态分析ida 动态分析gdb 如果发现…