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

Java 多态

文章目录

    • 1、多态的介绍
    • 2、多态的格式
    • 3、对象的强制类型转换
    • 4、instanceof 运算符
    • 5、案例:笔记本USB接口

1、多态的介绍

多态(Polymorphism)按字面意思理解就是“多种形态”,即一个对象拥有多种形态。

即同一种方法可以根据发送对象的不同而采用多种不同的行为方式。

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。

多态存在的条件

  • 有继承(基类)或 实现 (接口) 关系
  • 子类重写父类的方法
  • 父类引用变量指向子类对象

==注:==多态是针对实例方法的多态,不是属性的多态,也不是类方法的多态。

java 引用变量分为两种类型,一种是编译时类型,一种是运行时类型。

编译时类型由声明该变量时使用的类型决定;运行时类型由实际赋值给该变量的对象决定。

如果编译时类型和运行时类型不一致,就**可能(重写了方法的话)**出现所谓的多态。

class Person {public void eat() {	}
}class Student extends Person {// 重写了基类中的方法public void eat() {}// 子类中特有的方法public void study() {}
}class Applicaton {public static void main(String[] args) {// 不存在多态 编译时类型和运行时类型一致Student s3 = new Student();// 不存在多态 编译时类型和运行时类型一致Person s2 = new Person();// 存在多态 编译时类型和运行时类型不一致,重写了基类中的方法Person s1 = new Student();s1.eat();// 报错 原因下方会解释// s1.study();}
}

当把一个子类对象直接赋值给父类引用变量时:

例如上面的 Person s1 = new Student();

这个 s1 的引用变量的编译类型是 Person,而运行时类型是 Student,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量调用同一个方法时呈现出多种不同的行为特征,这就是多态。

这里的相同类型就是指同一个引用变量(s1),调用同一个方法,但指向不同的子类对象时,表现出不同的行为特征。

注:

1、通过引用变量来直接访问其包含的实例变量时,系统总是试图访问它编译时类型定义的实例变量,而不是运行时类型所定义的实例变量。

2、引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行阶段则可以调用它运行时类型所具有的的方法。

还是上面的例子:Person s1 = new Student(); s1 引用变量只能调用 Person 类的方法,不能直接调用 Student 里独有的方法。

作用

简单来说,就是建立一个父类对象的引用变量,指向不同的子类对象。

把不同的子类对象都当做父类来看待,屏蔽不同子类对象之间的差异,写出通用的代码,以适应需求的不断变化。

而且无论右边 new 的时候换成了哪个子类对象,等号左边的调用方法都不会变化。

2、多态的格式

  • 代码当中体现多态性,其实就是一句话:父类引用指向子类对象
  • 格式:
基类类型 引用变量名称 = new 子类类型(); // 通过继承实现
or
接口类型 引用变量名称 = new 实现类类型(); // 通过接口实现

对象的自动类型

多态的写法其实就是对象的自动类型(类型向上转),只不过是编译器自动完成的。

注:

向上转型一定是成功的,这也证实了子类其实是一种特殊的父类。

这种类型转换只是表明这个引用变量的编译时类型是基类,运行时类型是子类,执行方法时表现的是子类对象的行为方式。

如果想让基类引用变量调用子类中特有的方法,就需要进行强制类型转换。

3、对象的强制类型转换

强制类型转换需要借助于类型转换运算符—— (类型)

类型转换运算符的用法:(类型)变量名称

通过类型转换运算符将一个父类引用变量强转成子类引用变量时,需要注意一下几点:

1、基本类型之间的转换只能在数值类型之间进行。

数值类型:整型(byte、short、int、long)、字符型(char)、浮点型(float、double)。

数值类型和布尔类型之间不能进行类型转换。

2、引用类型之间的转换只能在具有继承 or 实现关系的两个类型之间进行,如果把两个不相关的类型之间进行转换,则会报类型转换异常:ClassCastException

示例

Person s1 = new Student();
// Person 类中没有 study() 方法 进行强制类型转换
((Student) s1).study();

考虑到进行强制类型转换时可能出现的异常,因此进行类型转换之前应先通过 instanceof 运算符来判断是否可以成功转换,避免出现异常,以增强程序的健壮性。

4、instanceof 运算符

使用:A instanceof B

作用:判断其左边对象(指运行时对象)是否为其右边类的实例,返回 boolean 类型的数据。

如果 A 和 B 不存继承话,会出现编译错误。

示例 1:

class Animal {}class Cat extends Animal {}class Dog extends Animal  {}class Applicaton {public static void main(String[] args) {Animal animal = new Dog();if (animal instanceof Dog) {System.out.println("汪汪~");} else if (animal instanceof Cat) {System.out.println("喵喵~");}}
}

实例 2:

// obj引用变量 编译时类型是 Object,运行时类型是String
// 因为Object是所有类、接口的父类,所以以下才可通过
Object obj = "chatGPT";
// String 是 Object 类的实例
System.out.println(obj instanceof Object);
// String 是 String 类的实例
System.out.println(obj instanceof String);
// String 不是 Math 类的实例
System.out.println(obj instanceof Math);
// String 是 Comparable 接口的实例。接口理解成一种特殊的类
System.out.println(obj instanceof Comparable);// 注意:这里的 str 没有用多态的写法
String str = "hello";// 编译不通过,str引用变量编译时类型是String和Math没有继承关系
// System.out.println(str instanceof Math);// String 对象是 Object 类的实例
System.out.println(str instanceof Object);

5、案例:笔记本USB接口

重点:接口的基本使用、对象的上下转型以及使用接口作为方法的参数。
Computer 使用 USB接口,Mouse、KeyBoards 实现 USB接口

USB 接口

// USB接口类
public interface USB {void open();void close();
}

Computer 类

// 电脑类
public class Computer {public void powerOn(){System.out.println("电脑开机");}public void powerOff(){System.out.println("电脑关机");}// 接口作为方法的参数public void useDevice(USB usb){usb.open();if (usb instanceof Mouse){ // 一定要先判断Mouse mouse = (Mouse)usb; // 向下转型mouse.click();} else if (usb instanceof KeyBoard) {KeyBoard keyboard = (KeyBoard)usb;keyboard.type();}usb.close();}
}

Mouse 类

// 鼠标类
public class Mouse implements USB{@Overridepublic void open() {System.out.println("打开鼠标");}@Overridepublic void close() {System.out.println("关闭鼠标");}public void click(){System.out.println("鼠标点击");}
}

KeyBoard 类

// 键盘类
public class KeyBoard implements USB{@Overridepublic void open() {System.out.println("打开键盘");}@Overridepublic void close() {System.out.println("关闭键盘");}public void type(){System.out.println("键盘输入");}
}

Demo02Main 测试类

public class Demo02Main {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();USB usbMouse = new Mouse();computer.useDevice(usbMouse);//        USB usbKeyBoard = new KeyBoard();KeyBoard keyBoard = new KeyBoard();computer.useDevice(keyBoard);computer.powerOff();}
}

相关文章:

Java 多态

文章目录1、多态的介绍2、多态的格式3、对象的强制类型转换4、instanceof 运算符5、案例:笔记本USB接口1、多态的介绍 多态(Polymorphism)按字面意思理解就是“多种形态”,即一个对象拥有多种形态。 即同一种方法可以根据发送对…...

九龙证券|一夜暴跌36%,美股走势分化,标普指数创近2月最差周度表现

当地时间2月10日,美股三大指数收盘涨跌纷歧。道指涨0.5%,标普500指数涨0.22%,纳指跌0.61%。 受国际油价明显上升影响,动力板块领涨,埃克森美孚、康菲石油涨超4%。大型科技股走低,特斯拉、英伟达跌约5%。热门…...

【数据库】 mysql用户授权详解

目录 MySQL用户授权 一,密码策略 1,查看临时密码 2,查看数据库当前密码策略: 二, 用户授权和撤销授权 1、创建用户 2,删除用户 3,授权和回收权限 MySQL用户授权 一,密码策略…...

【性能】性能测试理论篇_学习笔记_2023/2/11

性能测试的目的验证系统是否能满足用户提出的性能指标发现性能瓶颈,优化系统整体性能性能测试的分类注:这些测试类型其实是密切相关,甚至无法区别的,例如几乎所有的测试都有并发测试。在实际中不用纠结具体的概念。而是要明确测试…...

C语言(输入printf()函数)

printf()的细节操作很多,对于现阶段的朋友来说,主要还是以理解为主。因为很多的确很难用到。 目录 一.转换说明(占位符) 二.printf()转换说明修饰符 1.数字 2.%数字1.数字2 3.整型转换字符补充 4.标记 -符号 符号 空格符…...

Zabbix 构建监控告警平台(四)

Zabbix ActionZabbix Macros1.Zabbix Action 1.1动作Action简介 当某个触发器状态发生改变(如Problem、OK),可以采取相应的动作,如: 执行远程命令 邮件,短信,微信告警,电话 1.2告警实验简介 1. 创建告警media type&…...

2004-2019年285个地级市实际GDP与名义GDP

2004-2019年285个地级市实际GDP和名义GDP 1、时间:2004-2019年 2、范围:285个地级市 3、说明:GDP平减指数采用地级市所在省份当年平减指数 4、代码: "gen rgdp gdp if year 2003 gen rgdp gdp if year 2003" re…...

Node.js笔记-Express(基于Node.js的web开发框架)

目录 Express概述 Express安装 基本使用 创建服务器 编写请求接口 接收请求参数 获取路径参数(/login/2) 静态资源托管-express.static(内置中间件) 什么是静态资源托管? express.static() 应用举例 托管多个静态资源 挂载路径前缀…...

力扣sql简单篇练习(十五)

力扣sql简单篇练习(十五) 1 直线上的最近距离 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT min(abs(p1.x-p2.x)) shortest FROM point p1 INNER JOIN point p2 ON p1.x <>p2.x1.3 运行截图 2 只出现一次的最大数字 2.1 题目内容 2…...

浅谈动态代理

什么是动态代理&#xff1f;以下为个人理解:动态代理就是在程序运行的期间&#xff0c;动态地针对对象的方法进行增强操作。并且这个动作的执行者已经不是"this"对象了&#xff0c;而是我们创建的代理对象&#xff0c;这个代理对象就是类似中间人的角色&#xff0c;帮…...

Idea超好用的管理工具ToolBox(附带idea工具)

文章目录为什么要用ToolBox总结idea管理安装、更新、卸载寻找ide配置、根路径idea使用准备工作配置为什么要用ToolBox 快速轻松地更新,轻松管理您的 JetBrains 工具 安装自动更新同时更新插件和 IDE回滚和降级通过下载补丁或一组补丁而不是整个包&#xff0c;节省维护 IDE 的…...

Spring 中 ApplicationContext 和 BeanFactory 的区别

文章目录类图包目录不同国际化强大的事件机制&#xff08;Event&#xff09;底层资源的访问延迟加载常用容器类图 包目录不同 spring-beans.jar 中 org.springframework.beans.factory.BeanFactoryspring-context.jar 中 org.springframework.context.ApplicationContext 国际…...

情人节有哪些数码好物值得送礼?情人节实用性强的数码好物推荐

转瞬间&#xff0c;情人节快到了&#xff0c;大家还在为送什么礼物而烦恼&#xff1f;在这个以科技为主的时代&#xff0c;人们正在享受着科技带来的便利&#xff0c;其中&#xff0c;数码产品也成为了日常生活中必不可少的存在。接下来&#xff0c;我来给大家推荐几款比较实用…...

java中flatMap用法

java中map是把集合每个元素重新映射&#xff0c;元素个数不变&#xff0c;但是元素值发生了变化。而flatMap从字面上来说是压平这个映射&#xff0c;实际作用就是将每个元素进行一个一对多的拆分&#xff0c;细分成更小的单元&#xff0c;返回一个新的Stream流&#xff0c;新的…...

【MySQL Shell】8.9.2 InnoDB ClusterSet 集群中的不一致事务集(GTID集)

AdminAPI 的 clusterSet.status() 命令警告您&#xff0c;如果 InnoDB 集群的 GTID 集与 InnoDB ClusterSet 中主集群上的 GTID 集不一致。与 InnoDB ClusterSet 中的其他集群相比&#xff0c;处于此状态的集群具有额外的事务&#xff0c;并且具有全局状态 OK_NOT_CONSISTENT 。…...

logstash毫秒时间戳转日期以及使用业务日志时间戳替换原始@timestamp

文章目录问题解决方式参考问题 在使用Kibana观察日志排查问题时发现存在很多组的timestamp 数据一样&#xff0c;如下所示 详细观察内部数据发现其中日志数据有一个timestamp字段保存的是业务日志的毫秒级时间戳&#xff0c;经过和timestamp数据对比发现二者的时间不匹配。经…...

【C语言】qsort——回调函数

目录 1.回调函数 2.qsort函数 //整形数组排序 //结构体排序 3.模拟实现qsort //整型数组排序 //结构体排序 1.回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来…...

8年软件测试工程师经验感悟

不知不觉在软件测试行业&#xff0c;野蛮生长了8年之久。这一路上拥有了非常多的感受。有迷茫&#xff0c;有踩过坑&#xff0c;有付出有收获&#xff0c; 有坚持&#xff01; 我一直都在软件测试行业奋战&#xff0c; 毕业时一起入职的好友已经公司内部转岗&#xff0c;去选择…...

腾讯云安全组配置参考版

官方文档参考: 云服务器 安全组应用案例-操作指南-文档中心-腾讯云 新建安全组时&#xff0c;您可以选择腾讯云为您提供的两种安全组模板&#xff1a; 放通全部端口模板&#xff1a;将会放通所有出入站流量。放通常用端口模板&#xff1a;将会放通 TCP 22端口&#xff08;Lin…...

代码覆盖率工具OpenCppCoverage在Windows上的使用

OpenCppCoverage是用在Windows C上的开源的代码覆盖率工具&#xff0c;源码地址为https://github.com/OpenCppCoverage/OpenCppCoverage &#xff0c;最新发布版本为0.9.9.0&#xff0c;License为GPL-3.0。 从https://github.com/OpenCppCoverage/OpenCppCoverage/releases 下载…...

代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

77组合 看完题后的思路 void f&#xff08;数组&#xff0c;startIndex&#xff09;递归终止 if&#xff08;startIndex数组长度||path.sizek&#xff09;{ if(path.sizek){ 加入} }递归 for&#xff08;&#xff1b;startIndex<num.size&#xff1b;startIndex&#xff0…...

Python_pytorch

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包&#xff08;package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法&#xff08;def) Dataset 数据集处理 import os from PIL impo…...

【Java|golang】2335. 装满杯子需要的最短总时长

现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的…...

shell编程之sed

文章目录八、shell编程之sed8.1 工作原理8.2 sed基本语法8.3 模式空间中的编辑操作8.3.1 地址定界8.3.2 常用编辑命令8.4 sed扩展八、shell编程之sed 8.1 工作原理 sed是一种流编辑器&#xff0c;它是文本处理中非常有用的工具&#xff0c;能够完美的配合正则表达式使用&…...

安全寒假作业nginx反向代理+负载均衡上传webshell重难点+apache漏洞

1.应用场景 负载均衡作为现今解决web应用承载大流量访问问题的一种方案&#xff0c;在真实环境中得到广泛的部署。实现负载均衡的方式有很多种&#xff0c;比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。 比如基于dns的负载均衡&#xff1a; 当然还有…...

day35|01背包问题、416. 分割等和子集

01背包问题 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 例&#xff1a;背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品…...

Linux内核启动(3,0.11版本)内核启动完成与进入内核main函数

这一部分是在讲解head.s代码&#xff0c;这个代码与bootsect.s和setup.s在同一目录下&#xff0c;但是head.s程序在被编译生成目标文件后会与内核其他程序一起被链接成system模块&#xff0c;位于system模块的最前面开始部分。system模块将被放置在磁盘上setup模块之后开始的扇…...

【2023】Prometheus-Alertmanager高可用集群

本次实验准备了三个节点&#xff0c;分别为laert-01~03 目录1.安装Alertmanager2.配置启动文件3.验证集群4.关于集群的配置项1.安装Alertmanager 这部分内容在三个节点上都要执行 下载安装包&#xff0c;将安装包解压至/data目录下 wget https://github.com/prometheus/aler…...

2023-2-11 刷题情况

最短路计数 题目描述 给出一个 NNN 个顶点 MMM 条边的无向无权图&#xff0c;顶点编号为 1∼N1\sim N1∼N。问从顶点 111 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行包含 222 个正整数 N,MN,MN,M&#xff0c;为图的顶点数与边数。 接下来 MMM 行&…...

2019_41 考研408

2019年(单链表)41.(13分)设线性表采用带头结点的单链表保存&#xff0c;链表中的结点定义如下:typedef struct node {int data;struct node* next;}NODE;请设计一个空间复杂度为O(1)且时间上尽可能高效的算法&#xff0c;重新排列L中的各结点&#xff0c;得到线性表L(q,a,,a,an…...

海淀高端网站建设/河南网站定制

1、打开毕业论文&#xff0c;找到一个表格这里我随便写了一个表格&#xff0c;进行练习使用&#xff0c;数据本身没有参考价值2、点击一下表格&#xff0c;点击表设计&#xff0c;点击下面那个箭头3、选择新建表格样式4、首先&#xff0c;我们给这个模板命名为三线表&#xff0…...

网页前端模板网站/东莞网络推广优化排名

包括数据库、apache、tomcat集群安装。转载于:https://blog.51cto.com/395978/666658...

公司做网站的价格江阴/汕头网站建设方案开发

上篇文章《51单片机实现单极性spwm原理详解》已经详细介绍如何模拟单片机用代码在matlab-simulink中实现spwm调制&#xff0c;本文继续利用上文中的代码进行仿真&#xff0c;驱动单相全桥逆变器。首先对代码作部分修改&#xff0c;上述代码中默认正弦波与调制波幅值都是250&…...

网站制作费用开什么发票/企业培训方案制定

一、是什么 process 对象是一个全局变量,提供了有关当前 Node.js进程的信息并对其进行控制,作为一个全局变量 我们都知道,进程计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础,是线程的容器 当我们启动一个js文件,实际就是开启了一个服务进程,每个进程…...

wordpress 手机看不了视频/广州网站优化步骤

一. 概述  存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合&#xff0c;可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库与应用服务器之间的传输&#xff0c;提高数据处理效率是有好处的。存储过程和函数的区别在于函数必须有返回值&#xff0c;…...

三合一网站怎么做/广告策划公司

如题转载于:https://www.cnblogs.com/liujx2019/p/10560375.html...