java进阶---多态
多态的概述
什么是多态
同一个对象,在不同时刻表现出来的不同形态
多态的前提
- 要有继承或实现关系
- 要有方法的重写
- 要有父类引用指向子类对象
多态的具体实现
对象的多态是多态的核心和重点
规则:
- 一个对象的编译类型与运行类型可以不一致
- 编译类型在定义对象时,就确定了,不能改变,而运行类型是可以变化的
- 编译类型看定义对象=号的左边, 运行类型看=号的右边
代码演示
class Animal {public void eat(){System.out.println("动物吃饭");}
}class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
}public class Test1Polymorphic {/*多态的前提:1. 要有(继承 \ 实现)关系2. 要有方法重写3. 要有父类引用, 指向子类对象*/public static void main(String[] args) {// 当前事物, 是一只猫Cat c = new Cat();// 当前事物, 是一只动物Animal a = new Cat();a.eat();}
}
多态中的成员访问特点
成员访问特点
- 成员变量 :编译看父类,运行看父类
- 成员方法 :编译看父类,运行看子类
代码演示
class Fu{int num=10;public void method(){System.out.println("Fu..method")}
}class Zi extends Fu{int num=20;public void method(){System.out.println("Zi...method")}
}public class Test{public static void main(String[] args){Fu f=new Zi();System.out.println(f.num);f.method();}
}
//输出: 10 Zi..method
多态的好处和弊端
好处
提高程序的扩展性,定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
不能使用子类的特有成员
多态中的转型
向上转型
父类的引用指向子类对象就是向上转型
特点
- 编译类型看左边,运行类型看右边
- 可以调用父类的所有成员(须遵守访问权限)
- 不能调用子类的特有成员
- 运行效果看子类的具体实现
向下转型
一个已经向上转型的子类对象, 将父类引用转为子类引用
格式: 子类型 对象名 = (子类型) 父类的引用;
特点
- 只能强制转换父类的引用,不能强制转换父类的对象
- 要求父类的引用必须指向的是目标类型的对象
- 当向下转型后,可以调用子类类型中所有的成员
代码演示
class Fu {public void show(){System.out.println("Fu..show...");}
}class Zi extends Fu {@Overridepublic void show() {System.out.println("Zi..show...");}public void method(){System.out.println("我是子类特有的方法, method");}
}public class Test3Polymorpic {public static void main(String[] args) {// 1. 向上转型 : 父类引用指向子类对象Fu f = new Zi();f.show();// 多态的弊端: 不能调用子类特有的成员// f.method();// A: 直接创建子类对象// B: 向下转型// 2. 向下转型 : 从父类类型, 转换回子类类型Zi z = (Zi) f;z.method();}
}
多态中转型存在的风险和解决方案
风险
如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException
解决方案
关键字
instanceof
使用格式
变量名 instanceof 类型
通俗的理解: 判断关键字左边的变量,是否是右边的类型,返回Boolean类型结果
动态绑定
- 当调用方法时,该方法会和该对象的运行内存绑定
- 当调用对象属性时,没有动态绑定机制,即哪里声明,哪里使用
应用
多态数组
多态数组:数组的定义类型为父类类型,里面保存的实际元素为子类类型
代码演示
public class person{private String name;public Person(String name){this.name=name;}//get和set方法public String getName(){return name;}public Void setName(String name){this.name=name;}//mission()方法public String mission(){return name + "\t" + "做人要厚道";}
}public class Student extends Person {private double score;public Student(String name, double score) {super(name);this.score = score;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}//重写父类的say方法@Overridepublic String mission() { return super.mission() + " score =" + score + " 要好好学习!";}
}public class Teacher extends Person {private double salary;public Teacher(String name, double salary) {super(name);this.salary = salary;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//重写父类的 mission 方法@Overridepublic String mission() { return super.mission() + " salary =" + salary + " 要好好教书!";}
}
//开始演示多态数组
//创建一个Person对象
//创建一个Student对象
//创建一个Teacher对象
//统一放在数组里 并调用每个对象的missio()方法public class Arr{public static void main(String [] args){Person[] persons = new Person[3];Persons[0] = new Person("小白");Persons[1] = new Student("小王",12);Persons[2] = new Teacher("老黑",1000);//循环遍历多态数组for(int i; i < Persons.length; i++){//此位置涉及动态绑定机制//Persons[i]编译类型是Person , 运行类型根据实际情况由JVM判断System.out.prinln(Persons[i].mission())}}
}//运行结果
小白 做人要厚道!
小王 做人要厚道! score = 12 要好好学习!
老黑 做人要厚道! salary = 1000 要好好教书!
多态参数
方法定义的形参类型为父类类型,实参类型允许为子类类型
代码演示
//演示多态参数
public class PolyParameter { public static void main(String[] args) {Student s1 = new Student("小蓝同学");Teacher t1 = new Teacher("小绿老师");//需先 new 一个当前类的实例化,才能调用 test 方法PolyParameter polyParameter = new PolyParameter();//实参是子类polyParameter.test(s1);polyParameter.test(t1); }//定义方法test,形参为 Person 类型(形参是父类)//功能:调用学生的study或教师的teach方法public void test(Person p) {if (p instanceof Student){((Student) p).study(); //向下转型}else if (p instanceof Teacher){((Teacher) p).teach(); //向下转型} }
}//父类
class Person {private String name;//有参构造public Person(String name) {this.name = name;}// getter 和 setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}
}//子类
class Student extends Person {public Student(String name) {super(name);}// study() 方法public void study() { System.out.println(super.getName() + "\t" + "正在好好学习");}
}class Teacher extends Person {public Teacher(String name) {super(name);}// teach() 方法public void teach() { System.out.println(super.getName() + "\t" + "正在好好教书");}
}//运行结果
小蓝同学 正在好好学习
小绿老师 正在好好教书
相关文章:
java进阶---多态
多态的概述 什么是多态 同一个对象,在不同时刻表现出来的不同形态 多态的前提 要有继承或实现关系要有方法的重写要有父类引用指向子类对象 多态的具体实现 对象的多态是多态的核心和重点 规则: 一个对象的编译类型与运行类型可以不一致编译类型在定义对象时,就确定了,…...
常用脚本-持续更新(文件重命名、视频抽帧、拆帧、删除冗余文件、yolo2xml、转换图片格式、修改xml)
所有代码位置:Learning-Notebook-Codes/Python/常用脚本 1. 文件重命名 脚本路径:codes/files_rename.py脚本说明:可以自动重命名某个文件夹下指定类型的文件。 修改前文件名称: img1.jpg修改后文件名称: Le0v1n-20231123-X-0001.jpg imp…...
百度文心一言(千帆大模型)聊天API使用指导
开篇不得不吐槽下百度,百度智能云平台首页跳转千帆大模型平台的按钮太多了,不同按钮跳转不同的子页面,不熟悉的,能把人找懵。入口太多,就导致用户不知道从何开始。本文就从一个前端开发人员的角度,教大家快…...
C++知识点总结(7):玩转高精度除法
一、复习高低精度 一个数分为两种类型: 1. 高精度数,即一个长度特别长的数,使用 long long 也无法存储的一类数字。 2. 低精度数,即一个普通的数,可以使用 long long 来存储。 由于高精度除法比较简单,…...
LeetCode算法题解(动态规划,背包问题)|LeetCode1049. 最后一块石头的重量 II、LeetCode494. 目标和
一、LeetCode1049. 最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II 题目描述: 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将…...
使用Pytorch从零开始构建LSTM
长短期记忆(LSTM)网络已被广泛用于解决各种顺序任务。让我们了解这些网络如何工作以及如何实施它们。 就像我们一样,循环神经网络(RNN)也可能很健忘。这种与短期记忆的斗争导致 RNN 在大多数任务中失去有效性。不过&a…...
qRT-PCR相对定量计算详解qPCR相对定量计算方式——2^-(∆∆Ct) deta t
做完转录组分析之后,一般都要求做qRT-PCR来验证二代测序得到的转录本表达是否可靠。荧光定量PCR是一种相对表达定量的方法,他的计算方法有很多,常用的相对定量数据分析方法有双标曲线法,ΔCt法,2^-ΔΔCt法(Livak法)&a…...
BART non-Cartesian 重建:并行成像 压缩感知
本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。 目录 1 自定义MRI kspace trajectory 2 自定义该 trajectory下的多通道MRI数据 3 使用NUFFT 直接做欠采样数据的重建...
UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据
服务器代码编译运行 服务器udpconnectToServer.c的代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #inclu…...
SLAM ORB-SLAM2(9)闭环检测器
SLAM ORB-SLAM2(9)闭环检测器 1. LoopClosing2. 成员变量2.1. 系统成员变量2.2. 关键帧2.3. 共视关系2.4. 闭环检测2.5. 全局 BA(光束法平差)2.6. 其他操作3. 成员函数3.1. 构造函数3.2. 主要函数3.3. 更新操作3.4. 标识设置和查询接口1. LoopClosing 在《SLAM ORB-SLAM2(…...
目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】SLAM(基础篇)(二)
目录 知识储备 概率论基础 边缘概率 联合概率和独立 独立与条件独立...
TikTok 将开源“云中和”边缘加速器
“从某种意义上说,我们正在努力破解云的骨干网,以造福于我们,”TikTok产品管理基础设施经理Vikram Siwach指出,他解释了该公司即将开源的“全球服务加速器”的好处,这是一个可编程的边缘平台,可将应用程序需…...
【通讯协议】REST API vs GraphQL
在API设计方面,REST和GraphQL各有缺点。下图显示了 REST 和 GraphQL 之间的快速比较。 REST 使用标准 HTTP 方法(如 GET、POST、PUT、DELETE)进行 CRUD 操作。当您需要在单独的服务/应用程序之间提供简单、统一的接口时,效果很好…...
Linux在安装epel-release时,报错epel-release-7-14.noarch.rpm 的公钥尚未安装
Linux在安装epel-release时报错: [rootXWDBDEV01 ~]# yum install epel-release 已加载插件:fastestmirror, langpacks, product-id, search-disabled-repos, subscription-managerThis system is not registered with an entitlement server. You can …...
在 STM32 上实现温度补偿和校正
本文介绍了如何在 STM32 微控制器上实现温度补偿和校正,以提高温度传感器的测量精度。首先,我们将简要介绍温度补偿和校正的原理和目的。然后,我们将详细讨论在 STM32 上实现温度补偿和校正的步骤和方法。同时,提供了一个简单的示…...
PasteNow for mac剪贴板工具
PasteNow 是一款简单易用的剪贴板管理工具,可帮助用户快速存储和管理剪贴板上的文本和图片内容。用户可以使用 PasteNow 软件快速将文本内容保存到不同的笔记或页面中,也可以方便地将剪贴板上的图片保存到本地或分享给其他应用程序。 此外,P…...
Spark---补充算子
一、Spark补充Transformation算子 1、join,leftOuterJoin,rightOuterJoin,fullOuterJoin 作用在K,V格式的RDD上。根据K进行连接,对(K,V)join(K,W)返回(K,&a…...
第一百八十回 介绍两种阴影效果
文章目录 1. 概念介绍2. 实现方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容,本章回中将介绍两种阴影效果.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在…...
MyBatisPlus入门介绍
目录 一、MyBatisPlus介绍 润物无声 效率至上 丰富功能 二、Spring集成MyBatisPlus 三、SpringBoot集成MyBatisPlus 一、MyBatisPlus介绍 MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,…...
详解分布式微服务架构
目录 一、微服务简介 1、分布式微服务架的诞生 2、微服务架构与SOA架构的区别 3、微服务框架引来的问题 二、服务通信 RESTful API: 消息队列(如RabbitMQ、Kafka): gRPC: GraphQL: Service Mesh&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
