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来避免多次引用,符号格式为:<PROJECT>_<PATH>_<FILE>_H_例如头文件:foo/src/bar/baz.h#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif // FOO_BAR_BAZ_…...
一文掌握组织项目等级划分维度,标准和实例
当你遇到多项目怎么管?遇到项目之间的冲突怎么解决?很多公司没有项目优先级的划分,会对企业造成很多严重的问题。首先,会造成不合理的资源分配:缺少项目优先级的情况下,很难确定哪些项目是最重要的…...
【C++】list的使用和基本迭代器框架的实现 vs和g++下string结构的说明
真正的成熟应该并不是追求完美,而是直面自己的缺憾,这才是生活的本质。 文章目录一、初见list1.list的迭代器失效和基本使用2.list的operations操作接口(看起来挺不错的接口,但可惜不怎么实用)3.vector和list的排序性能…...
基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION
关于轴承相关的项目之前做的大都是故障识别诊断类型的,少有涉及回归预测的,周末的时候宅家发现一个轴承寿命加速实验的数据集就想着拿来做一下寿命预测。首先看下数据集如下:直接百度即可搜到,这里就不再赘述了。Learning_set为训…...
redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?
0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所…...
RTOS中互斥量的原理以及应用
互斥量的原理 RTOS中的互斥量是一种同步机制,用于保护共享资源,防止多个任务同时访问该资源,从而避免数据竞争和不一致性。 互斥量的原理是通过对共享资源进行加锁和解锁操作来实现的。 在RTOS中,互斥量通常是一个数据结构&…...
数据分析:基于随机森林(RFC)对酒店预订分析预测
数据分析:基于随机森林(RFC)对酒店预订分析预测 作者:AOAIYI 作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞…...
别再乱填了!手把手教你配置Keil的IROM1和IRAM1,让STM32程序跑得更稳
深度解析Keil内存配置:从原理到实战的STM32开发指南 当你第一次在Keil MDK的"Target"选项卡中看到IROM1和IRAM1的配置项时,是否感到困惑?这些看似简单的地址和大小设置,实际上关系到整个嵌入式系统的稳定运行。许多开发…...
Gemma-3-12b-it实战教程:对接企业微信/钉钉机器人实现图文消息自动解析
Gemma-3-12b-it实战教程:对接企业微信/钉钉机器人实现图文消息自动解析 1. 引言:当多模态AI遇上企业协作 想象一下这个场景:你的同事在企业微信群里发了一张复杂的业务流程图,问“这个流程的第三步有什么风险?”或者…...
4步攻克Python代码执行可视化:开发者调试效率提升指南
4步攻克Python代码执行可视化:开发者调试效率提升指南 【免费下载链接】viztracer VizTracer is a low-overhead logging/debugging/profiling tool that can trace and visualize your python code execution. 项目地址: https://gitcode.com/gh_mirrors/vi/vizt…...
AlertDialog高斯模糊进阶指南:Android12新特性与兼容方案对比
AlertDialog高斯模糊进阶指南:Android12新特性与兼容方案对比 在移动应用设计中,视觉层次的营造往往决定了用户体验的优劣。当用户与AlertDialog交互时,背景的高斯模糊效果能够有效聚焦注意力,同时保持界面连贯性。Android 12引入…...
MCP3202 12位SPI ADC驱动开发与嵌入式工程实践
1. MCP3202 12位串行ADC嵌入式驱动深度解析与工程实践1.1 芯片特性与系统定位MCP3202 是 Microchip 推出的低功耗、逐次逼近型(SAR)12位模数转换器,专为嵌入式系统中高精度模拟信号采集场景设计。其核心电气特性如下:参数规格工程…...
深入剖析大数据领域数据分片的优缺点
深入剖析大数据领域数据分片的优缺点 关键词:数据分片、大数据架构、分片策略、水平扩展、分布式系统 摘要:在大数据时代,单台服务器已无法承载海量数据的存储与计算需求,数据分片(Sharding)作为分布式系统…...
2025夏季技术实习「抢位战」:3步解锁2500+优质机会(附避坑指南)[特殊字符]
2025夏季技术实习「抢位战」:3步解锁2500优质机会(附避坑指南)🔥 【免费下载链接】Summer2026-Internships 2025年夏季技术实习机会集合! 项目地址: https://gitcode.com/GitHub_Trending/su/Summer2026-Internships…...
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南 【免费下载链接】IntelliJ-IDEA-Tutorial IntelliJ IDEA 简体中文专题教程 项目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial IntelliJ IDEA 是目前所有 IDE 中最具备沉浸式的 JVM …...
# 发散创新:用 Rust实现一个轻量级游戏日引擎的核心调度机制 在现代游戏开发中,**高效的任务调度与资源管理**是性能
发散创新:用 Rust 实现一个轻量级游戏日引擎的核心调度机制 在现代游戏开发中,高效的任务调度与资源管理是性能瓶颈的关键所在。尤其是在“游戏日”这类强调多线程并行处理、实时响应的场景下,传统基于 C 或 Python 的方案往往因内存安全问题…...
DHCP实验1
一、实验拓扑二、实验需求 1.PC1和PC2使用路由器模拟2.PC1和R1的g0/0口连接到SW的vlan10;PC2和R1的g0/1口连接到SW的vlan203.R1在vlan10的IP地址为192.168.1.1/24,vlan20的IP地址为192.168.2.1/244.在R1上配置DHCP服务,分别为2个网段分配IP地…...
