Java 多态
文章目录
- 多态
- 向上转型和向下转型
- 向上转型和重写
- 重写和重载的区别
- 动态绑定和静态绑定
- 用代码来解释什么是多态
- 向下转型
- 多态的优点
- 总结

多态
- 什么是多态?为什么要使用多态?
简单来说是多种形态,具体来说是去完成某个事情,当不同对象去完成同一件事表现出来的不同结果/状态
打个比方就是同一个人对待不同人表现出来的形态是不同的
2. 多态实现的三个条件:
向上转型和向下转型
向上转型和重写
- 将子类对象给父类类型的引用
父类类型 对象名 = new 子类类型()
直接赋值的
class Animal{public String name;public int age;public Animal(String name,int age){this.name = name;this.age = age;}// 父类中的this是当前对象的引用public void eat(){System.out.println(this.name + " ");}
}class Dog extends Animal{public Dog(String name,int age){super(name,age);// 调用父类的构造方法进行从父类继承过来的成员的构造}public void back(){System.out.println(this.name + "汪汪汪 ");}
}
public class test {public static void main(String[] args) { // 向上转型Animal animal = new Dog("小白",3);animal.eat();// 调用父类自己的eat}
}
- 第二种向上转型,传参的
- 传返回值的向上转型
- 重写的三个条件:
父类实现的方法不满足你需要的功能的时候可以进行重写
a. 方法的返回值一样
方法名一样
方法的参数列表一样
b. 被重写的方法的访问修饰限定符在子类中的要大于等于父类的
权限大小:private < 默认的 < protected < public
c. 被private的方法是不能被重写的
d. 被static修饰的方法是不能被重写的
e. 被final修饰的方法是不可以被重写的,因为具有了常性
f. 构造方法也是不可以被重写的
public final void eat(){// ...
}
被重写的方法返回值类型可以不同,但必须是父子关系
重写:在子类和父类中有同名的方法,
这时候子类对象给父类类型的引用(向上转型),使用该对象再调用,调用的是子类的方法,不再是父类的方法
上面的过程叫做动态绑定
下面是子类重写了父类的eat
@override可以提示你重写是否写错了,提示语法错误
重写和重载的区别
- object类是所有类的父类
Dog类重写了自己的toString,就使用自己的toString
没有重写就调用父类的toString
动态绑定和静态绑定
- 静态绑定:在编译的时候就确定了调用哪个方法,比如重载
- 动态绑定:在编译的时候不能确定,在运行时确定调用哪个方法,比如重写
用代码来解释什么是多态
- 不能调用子类特有的方法,只能调用父类的方法,重写啦才调用子类的方法(而且是同一个名字的方法,比如eat())
向下转型
- 父类对象给子类类型的引用
- 向下转型不安全
- 如果animal引用的对象是Cat对象的实例,如果是就成功,不是就走下面的打印
多态的优点
- 能够降低代码的圈复杂度,避免使用大量的if-else
- 一段代码中条件语句和循环语句出现的个数 , 这个个数就称为 " 圈复杂度 ".
不使用多态,打印下列图形?
class Shape {public void draw() {System.out.println("画图");}
}class Rect extends Shape {@Overridepublic void draw() {System.out.println("⬜");}
}class Cycle extends Shape {@Overridepublic void draw() {System.out.println("⚪");}
}class Flower extends Shape {@Overridepublic void draw() {System.out.println("❀");}
}class Test2 {public static void drawShapes() {Rect rect = new Rect();Cycle cycle = new Cycle();Flower flower = new Flower();String[] shapes = {"cycle","rect","cycle","rect","flower"};for(String shape : shapes) {if(shape.equals("cycle")) {cycle.draw();}else if (shape.equals("rect")) {rect.draw();}else{flower.draw();}}}public static void main(String[] args) {drawShapes();}
}
使用多态
public static void main(String[] args){Shape shapes = {new Cycle(),new Rect(),new Cycle(),new Rext(),new Flower()};// 向上转型for(Shape shape : shapes){shape.draw();}
}
- 可扩展能力强
如果要新增一种新的形状,使用多态该代码成本也比较低
class Flower extends Shape{public void draw(){System.out.println("花!");}
}
-
属性没有多态
当父类的成员变量和子类的成员变量同名时,通过父类引用,只能访问父类的变量 -
构造方法是没有多态的,因为不能重写,重写会造成构造的混乱
总结
-
多态主要就是下图中的三点
-
向上转型有什么用?
是重写的前提,一个子类对象给父类类型的引用 -
动态绑定有什么用?
是实现多态的基础,在编译的时候不确定调用哪个方法,在运行的时候确定调用哪个方法
相关文章:
Java 多态
文章目录 多态向上转型和向下转型向上转型和重写重写和重载的区别动态绑定和静态绑定用代码来解释什么是多态向下转型 多态的优点 总结 多态 什么是多态?为什么要使用多态? 简单来说是多种形态,具体来说是去完成某个事情,当不同对…...
机器学习中的泛化能力
我们常常提到模型的泛化能力,什么是泛化能力呢? 百度百科这样解释:是指机器学习算法对新鲜样本的适应能力。 学习的目的是学到隐含在数据背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输…...
第七章:数据存储策略与状态恢复机制实录
经过状态机、UI交互、逻辑驱动等章节的打磨,前端体系已经具备较强的调度与展示能力。但真正能决定组件在异常情况下能否“满血复活”的关键,落在了“状态恢复”这一关卡。尤其在安卓端环境复杂、网络波动频繁的前提下,若没有稳定的本地数据存…...
digitalworld.local: FALL靶场
digitalworld.local: FALL 来自 <digitalworld.local: FALL ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.4 3&…...
Java Collection(集合) 接口
Date: 2025-05-21 20:21:32 author: lijianzhan Java 集合框架提供了一组接口和类,以实现各种数据结构和算法。 以下是关于 Java 集合的核心内容说明: /*** Java Collection Framework 说明:** 在 Java 中,集合(Collec…...
直线型绝对值位移传感器:精准测量的科技利刃
在科技飞速发展的今天,精确测量成为了众多领域不可或缺的关键环节。无论是工业自动化生产线上的精细操作,还是航空航天领域中对零部件位移的严苛把控,亦或是科研实验中对微小位移变化的精准捕捉,都离不开一款高性能的测量设备——…...
Kotlin 极简小炒 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)
Kotlin 概述 Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可…...
Server-Driven UI:Kotlin 如何重塑动态化 Android 应用开发
以下是一篇整合详细代码示例的完整博客,深入探讨Kotlin在Server-Driven UI(SDUI)中的核心作用: Server-Driven UI:Kotlin 如何重塑动态化 Android 应用开发 1. Server-Driven UI 的核心价值 SDUI通过将UI描述与业务逻…...
基于多传感器融合的智能驾驶环境感知系统
摘要 随着自动驾驶技术的发展,单一传感器的局限性日益凸显。本文提出了一种基于多传感器(摄像头、毫米波雷达、激光雷达)融合的环境感知系统,通过深度学习算法实现车辆周围环境的精确感知。文章详细介绍了传感器标定、数据融合、目标检测与跟踪等关键技术,并提供了Python…...
JC/T 2848-2024 玻璃纤维增强石膏(GRG)装饰制品检测
玻璃纤维增强石膏装饰制品是指以玻璃纤维为主要增强材料,高强石膏为主要胶凝材料,适当掺入集料,外加剂的石膏装饰制品,GRG具有防火,隔音,被广泛应用于,墙板,装饰构件等。 JC/T 2848…...
每日算法 -【Swift 算法】寻找字符串中最长回文子串(三种经典解法全解析)
🧩 最长回文子串问题:三种经典解法全解析(含代码注释) 本文将系统讲解“最长回文子串”问题的三种常见解法:中心扩展法、动态规划、马拉车算法(Manacher’s Algorithm),并进行对比与…...
【Java高阶面经:数据库篇】13. MySQL 并发控制秘籍:MVCC 协议与隔离级别深度解析
一、MVCC核心原理:多版本并发控制的基石 1.1 为什么需要MVCC? 在传统锁机制中,读写操作会互相阻塞,导致高并发场景下性能下降。MVCC通过多版本数据快照避免读写阻塞,实现: 读不加锁:快照读(普通SELECT)不阻塞写操作写不阻塞读:写操作生成新版本,读操作访问历史版本…...
分布式集群中的共识算法及其在时序数据库IoTDB中的应用
一、引言 在分布式集群环境中,为了实现海量数据的横向扩展,数据通常被划分为多个子集并分散存储在集群的各个节点上。为了确保数据的高可用性,每个数据子集都会在多个物理节点上存储副本。然而,这种多副本机制也带来了新的挑战&a…...
Java面试实录:从JVM调优到Spring Cloud实践
Java大厂面试:当严肃面试官遇上搞笑程序员 场景设定 面试官:拥有多年行业经验的技术专家,对Java及相关技术栈有着深入的理解。明哥:一位自认为是“水货”的程序员,擅长用幽默化解紧张气氛,但面对复杂问题…...
自定义协议与序列反序列化
目录 引子: 一、再谈 "协议" 二、自定义协议与网络版计算器 1.约定方案一: 2.约定方案二: 3.我们采用的协议 三、网络计算器代码 Log.hpp 日志 Makefile Socket.hpp 套接字封装 Protocol.hpp 协议 序列化反序列化 结构化数据格式规定 TcpSe…...
SAP-ABAP:ABAP异常处理与SAP现代技术融合—— 面向云原生、微服务与低代码场景的创新实践
专题三:ABAP异常处理与SAP现代技术融合 —— 面向云原生、微服务与低代码场景的创新实践 一、SAP技术演进与异常处理的挑战 随着SAP技术栈向云端、微服务化和低代码方向演进,异常处理面临新场景: Fiori UX敏感度:用户期望前端友…...
JavaScript面试题之消息队列
JavaScript消息队列详解:单线程的异步魔法核心 在JavaScript的单线程世界中,消息队列(Message Queue)是实现异步编程的核心机制,它像一位高效的调度员,让代码既能“一心多用”又避免卡顿。本文将深入剖析消…...
【低代码】如何使用明道云调用 Flask 视图函数并传参(POST 方法实践)
在自动化办公或业务流程管理中,明道云提供了强大的 HTTP 请求节点,可以直接调用第三方 API,包括我们常见的 Flask 服务端接口。本文将详细介绍如何使用明道云通过 POST 方法调用 Flask 视图函数并传参,包括配置要点与 Python 后端的参数接收方法。 一、场景介绍 我们希望…...
广州卓远VR受邀参加2025智能体育典型案例调研活动,并入驻国体华为运动健康联合实验室!
近日,“2025年智能体育典型案例调研活动”在东莞松山湖成功举办。本次调研活动由国家体育总局体育科学研究所和中国信息通信研究院联合主办,旨在深入贯彻中央关于培育新型消费的战略部署,通过激活智能健身产品消费潜力,加快运动健…...
【WebRTC】源码更改麦克风权限
WebRTC源码更改麦克风权限 仓库: https://webrtc.googlesource.com/src.git分支: guyl/m125节点: b09c2f83f85ec70614503d16e4c530484eb0ee4f...
spring cloud alibaba-Geteway详解
spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中,Gateway 是一个非常重要的组件,用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化,提供了更强大的功能和更好的性能。 Gat…...
结课作业01. 用户空间 MPU6050 体感鼠标驱动程序
目录 一. qt界面实现 二. 虚拟设备模拟模拟鼠标实现体感鼠标 2.1 函数声明 2.2 虚拟鼠标实现 2.2.1 虚拟鼠标创建函数 2.2.2 鼠标移动函数 2.2.3 鼠标点击函数 2.3 mpu6050相关函数实现 2.3.1 i2c设备初始化 2.3.2 mpu6050寄存器写入 2.3.3 mpu6050寄存器读取 2.3.…...
Linux操作系统:信号
信号的基本介绍 信号是系统响应某个条件而产生的事件,进程接收到信号会执行响应的操作; (1)信号的储存位置 vim /usr/include/x86_64-linux-gnu/bits/signum.h 旧版 新版: vim /usr/include/x86_64-linux-gnu/bit…...
OpenCV CUDA模块特征检测与描述------用于创建一个最大值盒式滤波器(Max Box Filter)函数createBoxMaxFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 createBoxMaxFilter()函数创建的是一个 最大值滤波器(Maximum Filter),它对图像中每个像素邻域内的像素值取最…...
有没有其他影视app可以像群晖video station一样可以被Windows的本地网络驱动器找到
你是在寻找可以通过Windows本地网络(SMB共享)访问的影视媒体服务程序,就像群晖的 Video Station 一样,可以浏览、播放或挂载电影资源。以下是一些可选方案: ✅ 具备与 Synology Video Station 类似功能,并支…...
【神经网络与深度学习】流模型的通俗易懂的原理
流模型(Flow-based Model)简介 引言 流模型是一种强大的生成模型,它通过可逆变换将简单的概率分布转化为复杂的数据分布。相比于扩散模型和生成对抗网络(GAN),流模型可以精确计算数据的概率,并…...
OpenCV CUDA模块图像特征检测与描述------图像中快速检测特征点类cv::cuda::FastFeatureDetector
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::FastFeatureDetector 是 OpenCV 的 CUDA 加速模块中的一部分,用于在图像中快速检测特征点。FAST(Features fro…...
分享一些多模态文档解析思路
多模态文档解析思路小记 作者:Arlene 原文:https://zhuanlan.zhihu.com/p/1905635679293122466 多模态文档解析内容涉及:文本、表格和图片 解析思路v1 基于mineru框架对pdf文件进行初解析 其具备较完整的布局识别和内容识别,并将…...
【OCCT+ImGUI系列】009-Geom2d-Geom2d_AxisPlacement
一、Geom2d_AxisPlacement 简介 在 OpenCASCADE 的二维几何库中,Geom2d_AxisPlacement 是一个用于定义二维坐标系的几何类,主要包含一个原点(gp_Pnt2d)和一个方向向量(gp_Dir2d)。它在构造与控制二维几何对…...
【深度学习:理论篇】--Pytorch之nn.Module详解
目录 1.torch.nn.Module--概述 2.torch.nn.Module--简介 3.torch.nn.Module--实现 3.1.Sequential来包装层 3.2.children和modules 1.torch.nn.Module--概述 1. PyTorch vs. Keras 的设计差异 Keras(高层框架): 推荐通过继承 Layer 类…...
SQLMesh 宏操作符详解:@IF 的条件逻辑与高级应用
SQLMesh 的 IF 宏提供了一种在 SQL 查询中嵌入条件逻辑的方法,允许根据运行时条件动态调整查询结构。本文深入探讨 IF 的语法、使用场景及实际案例,帮助开发者构建更灵活、可维护的 SQL 工作流。 1. IF 宏简介 IF 是 SQLMesh 提供的条件逻辑宏ÿ…...
最新版Chrome浏览器调用ActiveX控件之eDrawings Viewer专用包v2.0.42版本发布
背景 eDrawings是一款轻量级的2D和3D浏览/可视化软件,主要用于查看和分享由SolidWorks创建的3D模型和2D工程图。它支持多种CAD文件格式,使得用户能够方便地在不同CAD系统之间转换和查看设计数据。适用于设计师和工程师之间的即时协作,通过电…...
人工智能应用时代:个人成长与职业突围的底层逻辑
当人工智能从实验室走向现实场景,从概念热词变为生产力工具,一场静默却深刻的变革正在重塑人类社会的运行规则。无论是算法驱动的智能推荐、语言模型支撑的自动化创作,还是工业机器人对传统生产线的颠覆,人工智能应用已渗透至社会…...
STM32之串口通信蓝牙(BLE)
一、串口通信的原理与应用 通信的方式 处理器与外部设备之间或者处理器与处理器之间通信的方式分两种:串行通信和并行通信。 串行通信 传输原理:数据按位依次顺序传输(每一位占据固定的时间长度 MSB or LSB) 优点:…...
【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践
目录 1.前言 2.正文 2.1配置文件的格式 2.2properties 2.2.1基础语法 2.2.2value读取配置文件 2.2.3缺点 2.3yml 2.3.1基础语法 2.3.2配置不同数据类型 2.3.3配置读取 2.3.4配置对象和集合 2.3.5优缺点 2.4综合练习:验证码案例 2.4.1分析需求 2.4.2…...
数据结构篇--优先级队列排序--实验报告
实验简介框架代码实验步骤运行结果实验总结 实验概述 优先队列排序算法的基本思想是: 将所有待排序元素依次插入到优先队列中,然后按照从大到小的顺序,通过重复删除优先队列中的最大元素,取出所有元素,从而实现排序…...
【图像大模型】基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析
基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析 一、技术背景与核心创新1.1 图像超分辨率技术演进1.2 核心技术创新对比 二、算法原理深度解析2.1 网络架构设计2.1.1 RRDB模块结构 2.2 损失函数设计2.2.1 对抗损失(Adversarial Loss)2.2.2 感知损…...
Ubuntu 20.04卸载并重装 PostgreSQL
在 Ubuntu 下彻底卸载并重新安装 PostgreSQL(包括所有版本及其数据目录)的步骤 下面是一个在 Ubuntu 下彻底卸载并重新安装 PostgreSQL(包括所有版本及其数据目录)的步骤。 文章目录 在 Ubuntu 下彻底卸载并重新安装 PostgreSQL&…...
debian系统redis-dump安装
1. Ruby 环境 Redis-dump 是一个 Ruby 工具,需先安装 Ruby 和 RubyGems。 安装命令: sudo apt update sudo apt install ruby-full build-essential[roota29d39f5fd10:/opt/redis-dump/bin# apt install ruby-full build-essential Reading pac…...
AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系
一、背景 移动终端普及使随意用机成为常态,在生产车间、加油站、考场、手术室等场景,人员使用手机易引发生产事故、爆炸、作弊、仪器干扰等问题。传统人工巡查存在覆盖不足、响应慢、主观性强等局限,难以满足现代安全管理需求。AI智能分析…...
支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!
之前文章和大家分享过,将会出一篇专栏(从电脑装ubuntu系统,到安装ubuntu的常用基础软件:jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等),目前…...
小土堆pytorch--神经网络-非线性激活线性层及其他层介绍
1. 神经网络-非线性激活 1.1 relu与sigmoid 1.1.1 ReLU(Rectified Linear Unit,修正线性单元 ) 定义与数学表达:数学定义为 f ( x ) max ( 0 , x ) f(x) \max(0, x) f(x)max(0,x) ,即当输入 x > 0 x > …...
【Vue3】数据的返回和响应式处理(ref reactive)
目录 一、拉开序幕的setup 二、ref函数 2.1 访问对象的响应式处理 小结:ref函数 三、reactive函数 3.1 reactive同样也可以修改数组: 3.2 reactive小结: 四、Vue3中的响应式原理 4.1 vue2的响应式,对象属性的添加 4.2…...
【Rust智能指针】Rust智能指针原理剖析与应用指导
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
C++ - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库)
C - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库) muduo库的基层原理核心概念总结:通俗例子:餐厅模型优势体现典型场景 muduo库中的主要类EventloopMuduo 的 EventLoop 核心解析1. 核心机制:事…...
Java异常处理全解析:从基础到自定义
目录 🚀前言🤔异常的定义与分类💯运行时异常💯编译时异常💯异常的基本处理 🌟异常的作用🐧自定义异常💯自定义运行时异常💯自定义编译时异常 ✍️异常的处理方案…...
C++初阶-vector的模拟实现2
目录 1.vector已经实现的代码总结 2.vector::resize的模拟实现 3.vector::vector(const vector& v)拷贝构造函数的模拟实现 4.vector::operator(const vector& x)的模拟实现(原始写法) 5.vector::swap的模拟实现 6.vector::operator(const …...
【图数据库】--Neo4j 安装
目录 1.Neo4j --概述 2.JDK安装 3.Neo4j--下载 3.1.下载资源包 3.2.创建环境变量 3.3.运行 Neo4j 是目前最流行的图形数据库(Graph Database),它以节点(Node)、关系(Relationship)和属性(Property)的形式存储数据,专门为处理高度连接的数据而设计。…...
elementui初学1
当然可以!下面是从零开始创建一个最简单的 Element UI 程序的完整流程,基于 Vue 2 Element UI(如果你想用 Vue 3,请告诉我,我可以给你 Element Plus 的版本)。 ✅ 一、准备环境 确保你已经安装了…...
lanqiaoOJ 4185:费马小定理求逆元
【题目来源】 https://www.lanqiao.cn/problems/4185/learning/ 【题目描述】 给出 n,p,求 。其中, 指存在某个整数 0≤a<p,使得 na mod p1,此时称 a 为 n 的逆元,即 。数据保证 p 是质数且 n mod p≠0…...