当前位置: 首页 > news >正文

Java面向对象特征之三:多态

一:面向对象三大特征之三:多态

1.多态是什么?

同类型的对象,执行同一个行为,会表现出不同的行为特征。

比如:猫和狗都是动物类型,执行同一个行为,但是会表现出不同的行为特征;

2.多态的常见形式

父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;

例:

/*
动物类父类抽象类*/
public abstract class Animal {public abstract void run();
}
/*
狗类:子类,继承动物类*/
public class Dog extends Animal {@Overridepublic void run() {System.out.println("狗恰狗粮");}
}
/*
猫类:子类,继续动物类*/
public class Cat extends Animal {@Overridepublic void run() {System.out.println("猫恰猫粮");}
}
public class PolymorphismTest {public static void main(String[] args) {//这是之前的形式Dog d1 = new Dog();d1.run();Cat c1 = new Cat();c1.run();System.out.println("----------------");/*多态的形式为:父类类型 对象名称 = new 子类构造器;例如下 右边的狗对象 赋值 给 左边的动物对象下方狗对象只代表单种动物类型;但是动物对象代表所有的动物,属于是小范围赋值给大范围,合情合理。*/Animal d2 = new Dog();d2.run();Animal c2 = new Cat();c2.run();}
}

控制台输出结果:


3.多态中成员访问特点

方法调用:编译看左边,运行看右边;

 

如上:

1.编译阶段的时候会去到这个Animal类里找run方法 

2.找到了以后,等到运行的时候就会去Dog类里找run方法


变量调用:编译看左边,运行也看左边;(多态侧重行为多态)

  

 


4.多态的前提

需要有继承/实现关系;有父类引用指向子类对象;有方法重写。


二:多态的优势

1.优势

(1)在多态形式下,右边对象可以实现解耦合,便于扩展和维护;

没换掉之前:

 

 把🐕对象更换成🐱,run行为也会跟着改变,不需要改动代码


 (2)定义方法的时候,使用父类作为参数,该方法就可以接收这个父类的一切子类对象,体现出多态的扩展与便利;

所有动物参加赛跑比赛

public class PolymorphismTest {public static void main(String[] args) {System.out.println("---比赛开始---");Animal d1 = new Dog();go(d1);Animal c1 = new Cat();go(c1);System.out.println("吃得一样快,比赛结束,平手平手");}/*需求:所有动物可以一起参加比赛*/public static void go(Animal a){a.run();}
}

执行原理:在上列代码中,第一步会先将狗对象的地址给到a1,然后go方法再将狗对象的地址传给形参a,形参a接收到对象地址后,根据地址去访问狗对象里的run行为。


2.多态下产生的问题

多态下不能使用子类的独有功能:

因为父类是被继承的,因此继承了父类的子类会有父类的一切行为,但是父类是没有子类独有行为的。

 

三:多态下引用类型的类型转换

1.引用类型是什么?

也就是我们自己定义的:动物类、学生类、狗类猫类等等。

2.引用类型的类型转换

自动类型转换:子类对象赋值给父类类型的变量指向。

因为父类范围大,所有子类对象赋值给父类类型的变量指向➡属于:小范围赋值给大范围,因此是自动类型转换。

强制类型转换(从父到子):

子类 对象变量 = (子类)父类类型的变量;

作用:可以解决多态下的劣势,可以实现调用子类的独有行为(方法功能)。

public class Animal {/*动物通用行为:跑*/public void run(){System.out.println("动物可以跑^_^");}
}
public class Dog extends Animal{/*重写父类run方法*/@Overridepublic void run() {System.out.println("🐕跑得飞快~~");}/*狗类独有方法:看门*/public void lookDoor(){System.out.println("🐕看门");}
}
public class Cat extends Animal{@Overridepublic void run() {System.out.println("🐱跑得也很快");}public void bullyDog(){System.out.println("🐱在欺负🐕");}
}
public class PolymorphismTest {public static void main(String[] args) {System.out.println("多态下引用类型的自动类型转换:");Animal a1 = new Dog();a1.run();
//        报错,多态下不能访问子类独有功能
//        a1.lookDoor();System.out.println("------------");Animal a2 = new Cat();a2.run();
//        报错,多态下不能访问子类独有功能
//        a2.bullyDog();System.out.println("\n多态下引用类型的强制类型转换");
//        从父类类型到子类类型,大转小→必须强制类型转换Dog d = (Dog) a1;d.run();d.lookDoor();System.out.println("-------------");
//        从父类类型到子类类型,大转小→必须强制类型转换Cat c = (Cat) a2;c.run();c.bullyDog();}
}

控制台输出结果:

 注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException

3.instanceof关键字 

Java建议多态下的引用类型在强制类型转换的前,使用 instanceof 关键字判断当前对象的真实类型,再进行强制类型转换。

变量名 instanceof 真实类型
判断 instanceof 左边的变量指向的对象的真实类型,是否与右边的类型或者与其子类类型一样,是则返回true,反之。
        Animal a3 = new Cat();
//        强制类型转换,编译阶段不报错的(注意:继承或者实现关系编译阶段可以强制,没有毛病),运行可能出错了
//        Dog dog = (Dog)a3;
//        java建议在强制转换前使用instanceof关键字判断当前对象的真实类型,再进行强制转换if (a3 instanceof Cat){     //判断a3指向的是不是Cat类Cat cat = (Cat)a3;      //是cat,强制转换成cat类,从父类类型到子类类型大转小,必须进行强制类型转换cat.run();              cat.bullyDog();}else if (a3 instanceof Dog){   //反之,判断a3指向是Dog则强制转换成狗类型Dog dog = (Dog) a3;dog.run();dog.lookDoor();}System.out.println("-------------");

 

 

        System.out.println("-------------");Animal a3 = new Dog();
//        强制类型转换,编译阶段不报错的(注意:继承或者实现关系编译阶段可以强制,没有毛病),运行可能出错了
//        Dog dog = (Dog)a3;
//        java建议在强制转换前使用instanceof关键字判断当前对象的真实类型,再进行强制转换if (a3 instanceof Cat){     //判断a3指向的是不是Cat类Cat cat = (Cat)a3;      //是cat,强制转换成cat类,从父类类型到子类类型大转小,必须进行强制类型转换cat.run();cat.bullyDog();}else if (a3 instanceof Dog){   //反之,判断a3指向是Dog则强制转换成狗类型Dog dog = (Dog) a3;dog.run();dog.lookDoor();}System.out.println("-------------");

 4.知识总结:

1.引用类型的类型转换,有几种方式?

自动类型转换,强制类型转换。

2.强制类型转换能解决什么问题?需要注意什么?

可以解决多态下不能访问子类独有功能的问题,强制转换后可以访问;

有继承或者实现关系的两个类型就可以进行强制转换,编译无问题;

运行时,如果发现强制转换后的类型不是对象的真实类型则会报错;

注意:Java建议强制转换前使用instanceof关键字判断一下当前对象的真实类型,再进行强制类型转换

相关文章:

Java面向对象特征之三:多态

一:面向对象三大特征之三:多态 1.多态是什么? 同类型的对象,执行同一个行为,会表现出不同的行为特征。 比如:猫和狗都是动物类型,执行同一个行为,但是会表现出不同的行为特征&…...

基于ATX自动化测试解决方案

在整车开发中,诊断功能实现后需要进行测试验证。测试验证主要分为两个方面:诊断协议层测试和诊断功能测试。诊断协议层测试:需要对服务层服务定义、传输层相关时间参数进行测试验证;诊断功能测试:需要对各诊断功能项&a…...

Qt学习5-Qt Creator文件操作(哔站视频学习记录)

实现文件编辑器代码 目录 一、代码要点 二、重点函数 1、conncet 2、getOpenFileName 3、getSaveFileName 4、读取文件到textEdit 5、textEdit保存到文件 三、全部代码 mainwindow.h mainwindow.cpp 一、代码要点 MainWindow的菜单栏实现;connect函数连接…...

LeetCode15三数之和 容易理解版本

题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三…...

Spring Boot 3.0系列【11】核心特性篇之国际化

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言基础知识国际化简介浏览器语言LocaleMessageSourceMessageSourcePropertiesLocaleResolver案例演示案例一:后台消息国…...

每日学术速递3.7

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Dropout Reduces Underfitting 标题:Dropout 减少欠拟合 作者:Zhuang Liu, Zhiqiu Xu, Joseph Jin, Zhiqiang Shen, Trevor Darrel 文章链接:h…...

灯具照明行业MES系统,助力企业实现数字化转型

灯具照明行业在制造领域,是典型的高科技离散生产制造模式,大部分企业都设置:电源组件、光源组件、或光电一体组件 ,工艺以SMT、DIP等。 灯罩主要采用吸塑工艺及模具加工;其它金属的面盖、灯体、灯盒基本都是采用压铸、…...

超实用!JavaScript修改CSS变量,达到动态修改样式的目的

在网页开发中,我们通常使用CSS来设置网页的样式。但是,在开发过程中,有时候我们需要根据不同的条件来动态修改样式,这时候就需要使用JavaScript来实现。 在CSS中,有一种变量的概念,可以使用变量来定义颜色…...

解决Vue3 默认槽的非函数值 - Non-function value encountered for default slot 的警告

解决警告⚠️:[Vue warn]: Non-function value encountered for default slot. Prefer function slots for better performance. h函数的第三个参数加上箭头函数 原因分析: 一般 第三个参数如果不是默认插槽的话 就是当作children传下去,…...

【Git】P2 分支(创建分支,合并分支,分支冲突,分支分类)

分支分支的概念2077 与 分支git - 分支分支语句查看与创建分支切换与删除分支合并分支分支冲突分支分类分支的概念 什么是分支? 2077 与 分支 我最喜欢的游戏就是 赛博朋克2077,美国末日 和 GTA,下图是2077的存档。 存档非常多的原因是因为…...

2023年全国最新交安安全员精选真题及答案14

百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 41.事故隐患泛指生产系统中可导致事故发生的() A.人的不…...

Air101|Air103|Air105|Air780E|ESP32C3|ESP32S3|Air32F103开发板:概述及PinOut

内容均引自合宙官方wiki,详细内容请参考: :LuatOS 文档 。 1、合宙Air101(芯片及开发板) 合宙Air101是一款QFN32 封装,4mm x 4mm 大小的mcu。通用串口波特率,设置波特率为921600。 固件编译可…...

【代码随想录训练营】【Day35】第八章|贪心算法|860.柠檬水找零|406.根据身高重建队列|452. 用最少数量的箭引爆气球

柠檬水找零 题目详细:LeetCode.860 一道非常简单的模拟题,根据题目要求编写程序即可: Java解法(模拟): class Solution {public boolean lemonadeChange(int[] bills) {int money_5 0, money_10 0;fo…...

嵌入式C基础知识(23)

常用C/C代码规范头文件的保护所有的头文件都应该使用#define来避免多次引用&#xff0c;符号格式为&#xff1a;<PROJECT>_<PATH>_<FILE>_H_例如头文件&#xff1a;foo/src/bar/baz.h#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif // FOO_BAR_BAZ_…...

一文掌握组织项目等级划分维度,标准和实例

当你遇到多项目怎么管&#xff1f;遇到项目之间的冲突怎么解决&#xff1f;很多公司没有项目优先级的划分&#xff0c;会对企业造成很多严重的问题。首先&#xff0c;会造成不合理的资源分配&#xff1a;缺少项目优先级的情况下&#xff0c;很难确定哪些项目是最重要的&#xf…...

【C++】list的使用和基本迭代器框架的实现 vs和g++下string结构的说明

真正的成熟应该并不是追求完美&#xff0c;而是直面自己的缺憾&#xff0c;这才是生活的本质。 文章目录一、初见list1.list的迭代器失效和基本使用2.list的operations操作接口&#xff08;看起来挺不错的接口&#xff0c;但可惜不怎么实用&#xff09;3.vector和list的排序性能…...

基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION

关于轴承相关的项目之前做的大都是故障识别诊断类型的&#xff0c;少有涉及回归预测的&#xff0c;周末的时候宅家发现一个轴承寿命加速实验的数据集就想着拿来做一下寿命预测。首先看下数据集如下&#xff1a;直接百度即可搜到&#xff0c;这里就不再赘述了。Learning_set为训…...

redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

0. 引言 最近线上的一个状态修改功能出现了问题&#xff0c;一开始是运营找了过来&#xff0c;运营告知某条数据的状态已经开启了的&#xff0c;但是实际使用起来还是没有生效&#xff0c;于是拿到这个问题后&#xff0c;首先就去数据库查了这条数据&#xff0c;发现确实如他所…...

RTOS中互斥量的原理以及应用

互斥量的原理 RTOS中的互斥量是一种同步机制&#xff0c;用于保护共享资源&#xff0c;防止多个任务同时访问该资源&#xff0c;从而避免数据竞争和不一致性。 互斥量的原理是通过对共享资源进行加锁和解锁操作来实现的。 在RTOS中&#xff0c;互斥量通常是一个数据结构&…...

数据分析:基于随机森林(RFC)对酒店预订分析预测

数据分析&#xff1a;基于随机森林(RFC)对酒店预订分析预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...