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

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录

  • 一、多态的概述
  • 二、多态中成员访问特点
  • 三、多态的优势与劣势
  • 四、多态下的类型转换
    • 4.2 自动类型转换(从子到父)
    • 4.2 强制类型转换(从父到子)
    • 4.3 instanceof 关键字


一、多态的概述

多态:是指执行同一个行为,会表现出不同的特征。

常见格式:

在这里插入图片描述

多态的前提: 有继承 / 实现关系;有父类引用指向子类对象;有方法重写(多态侧重行为多态)


二、多态中成员访问特点

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

    如下面例子:编译的时候是观察 Animal 对象是否有 run 方法,而运行时调用子类的方法。

  • 变量调用:编译看左,运行也看左

    如下面例子:编译的时候是观察 Animal 对象是否有 name 变量,并且运行时调用的也是父类的变量。

    public abstract class Animal {public String name = "动物";public abstract void run();
    }
    public class Dog extends Animal{public String name = "狗狗";@Overridepublic void run() {System.out.println("狗在跑~~");}
    }
    public class Tortoise extends Animal {public String name = "乌龟";@Overridepublic void run() {System.out.println("乌龟在跑~~");}
    }
    
    public class Test {public static void main(String[] args) {Animal dog = new Dog();dog.run(); // 狗在跑~~System.out.println(dog.name); // 动物Animal tortoise = new Tortoise();tortoise.run(); // 乌龟在跑~~System.out.println(tortoise.name); // 动物}
    }
    

    注:多态注重行为多态。


三、多态的优势与劣势

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

Animal a = new Dog();
a.run(); // 后续业务行为随对象而变,后续代码无需修改

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

public class Test {public static void main(String[] args) {Animal dog = new Dog();Animal tortoise = new Tortoise();run(dog); // 狗在跑~~run(tortoise); // 乌龟在跑~~}public static void run(Animal animal){animal.run();}
}

多态下会产生一个问题:多态下不能使用子类的独有功能,因此可利用强制类型转换解决此问题。


四、多态下的类型转换

4.2 自动类型转换(从子到父)

子类对象赋值给父类类型的变量指向。

在这里插入图片描述


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

父类类型的变量强制转换为子类对象,格式如下:

在这里插入图片描述

作用:可以解决多态下的劣势,可以实现调用子类独有的功能

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

在这里插入图片描述


4.3 instanceof 关键字

Java 建议强转前使用 instanceof 判断当前对象的真实类型,再进行强制转换。

在这里插入图片描述

判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回 true,反之返回 false。

例1:调用子类独有功能。

public class Animal {public String name = "动物";public void run(){System.out.println("动物可以跑~~");}
}
public class Dog extends Animal {public String name = "狗狗";@Overridepublic void run() {System.out.println("狗在跑~~");}/**独有功能*/public void lookDoor(){System.out.println("狗在看门!");}
}public class Tortoise extends Animal {public String name = "乌龟";@Overridepublic void run() {System.out.println("乌龟在跑~~");}/**独有功能*/public void layEggs(){System.out.println("乌龟在下蛋!");}
}
public class Test1 {public static void main(String[] args) {// 自动类型转换Animal a = new Dog();a.run();// a.lookDoor(); // 多态下无法调用子类独有功能// 强制类型转换:可以实现调用子类独有功能的// 规定:有继承或者实现关系的 2 个类型就可以强制类型转换,运行时可能出现问题。// Tortoise t = (Tortoise) a; // 报错。编译阶段可以强制执行不会出错,运行时可能会出错Dog d = (Dog) a; // 因为 a 可能不是 Dog,可能是 Tortoise,因此需要强转d.lookDoor();// 建议强制转换前,先判断变量指向对象的真实类型,再强制类型转换。if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs(); // 调用子类独有的功能}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}}
}

例2:多态作为参数的实例。

public class Test2 {public static void main(String[] args) {Animal a1 = new Dog();go(a1);}public static void go(Animal a){System.out.println("预备~~~");a.run();// 独有功能if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs();}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}System.out.println("结束~~~~");}
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

相关文章:

Java 基础进阶篇(七)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换(从子到父)4.2 强制类型转换(从父到子)4.3 instanceof 关键字 一、多态的概述 多态:是指执行同一个行为…...

day9 实现UDP通信

目录 socket函数拓展 UDP通信实现过程 代码实现 socket函数拓展 send与recv函数: /*用于发送数据*/ ssize_t send(int sockfd, const void *buf, size_t len,int flags);/*用于接收数据*/ ssize_t recv(int sockfd, void *buf, size_t len,int flags);/*前三个…...

自然语言处理(NLP)在放射学报告评价中的应用:应用和技术进展

自然语言处理(NLP)在放射学报告评价中的应用:应用和技术进展 写在最前面摘要引言先进的技术BERT算法优点 Applications in Radiology 放射学应用Quality 质量将关键发现通知转诊临床医生放射科关键绩效指标和评估 个别放射科医生的表现同行学…...

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目,在查看项目中代码及具体细节时,发现这个项目真实一堆乱麻,没有规律可循,可总结下这个项目的缺陷 没有规律可循,没有结构性设计不做公共封装&#…...

OSPF的优化

O_ASE --- 标志域外路由信息 --- 因为域外的路由信息不可控性较强,所以,信任程度较低,我们将其优先级设置为150。 LSA --- 链路状态通告 --- OSPF协议在不同网络环境下产生的用于携带和传递不同的信息。 LSDB --- 链路状态数据库 SPF --- 最短…...

C++项目中打破循环依赖的锁链:实用方法大全

C项目中打破循环依赖的锁链 一、简介(Introduction)1.1 循环依赖的定义(Definition of Circular Dependencies)1.2 循环依赖带来的问题(Problems Caused by Circular Dependencies)1.3 解决循环依赖的重要性…...

IDEA连接HBase

新建maven工程 打开pom.xml添加hbase需要的依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.3.5</version> </dependency><dependency><groupId>org.apa…...

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址&#xff1a;http://arxiv.org/abs/2112.01527 项目地址&#xff1a;https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成&#xff1a; 主干特征提取器&#xff…...

【量化课程】01_投资与量化投资

文章目录 1.1 什么是投资1.1.1 经济意义上的投资1.1.2 投资的分类1.1.3 金融投资1.1.4 个人投资者投资品种1.1.5 投资VS投机 1.2 股票投资的基本流程1.3 常见的股票投资分析流派1.3.1 投资者分析流派 1.4 什么是量化投资1.4.1 量化投资基本概念1.4.2 量化投资的优势1.4.3 量化投…...

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现&#xff0c;前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的&#xff0c;不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。再次声明&#xff0c;…...

NSSCTF之Misc篇刷题记录⑧

NSSCTF之Misc篇刷题记录 [MMACTF 2015]welcome[广东强网杯 2021 团队组]欢迎参加强网杯[虎符CTF 2022]Plain Text[SWPUCTF 2021 新生赛]原来你也玩原神[SWPUCTF 2021 新生赛]我flag呢&#xff1f;[鹤城杯 2021]New MISC NSSCTF平台&#xff1a;https://www.nssctf.cn/ PS&…...

从零开始学习Linux运维,成为IT领域翘楚(七)

文章目录 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装&#x1f525;Linux下常用软件安装_MySQL安装&#x1f525;Linux下常用软件安装_MySQL卸载 &#x1f525;Linux下常用软件安装_JDK和Tomcat安装 Jdk 安装 解压jdk安装包 tar -zxvf jdk-8u201-linux-x64.tar.gz -C/…...

优漫动游设计APP的UI界面需要注意哪些问题?

一、加载   加载时间的长短&#xff0c;很大程度的决定了用户体验是否有所提升&#xff0c;虽然理想中的页面加载出来应该一秒就够了&#xff0c;但是设计师不要忽略网络问题!如果网速不够的话&#xff0c;页面加载三五秒都算是快的了&#xff0c;所以在用户等待的过程中&a…...

面试 004

什么是 Java 内存结构 Java 内存结构就是 JVM 的运行书数据区的内存结构&#xff1a; 里面有堆、虚拟机栈、本地方法栈、程序计数器&#xff1b; 虚拟机栈&#xff1a;里面的数据结构是栈帧&#xff0c;存放了方法名&#xff0c;局部变量等信息 方法区在 1.8 的时候&#xf…...

CCF-202206-2-寻宝!大冒险!

目录 题目背景 问题描述 一、思路&#xff1a; 二、实现方法&#xff08;C&#xff09; 2.1、方法一&#xff08;int储存&#xff09; 思路&#xff1a; C实现如下&#xff1a; 2.2、方法二&#xff08;结构体储存&#xff09; 思路&#xff1a; 注意&#xff1a;边界…...

二叉搜索树中的众数

1题目 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&…...

认识JSP

什么是JSP? JSP&#xff08;Java Server Pages&#xff09;是一种类似于HTML的标记语言&#xff0c;用于创建动态Web页面。与HTML不同的是&#xff0c;JSP页面中可以嵌入Java代码&#xff0c;由Web服务器在动态页面中生成HTML代码&#xff0c;从而实现Web应用程序的前端交互效…...

MySQL数据管理

一、MySQL数据库管理 1、库和表 行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性 2、常用的数据类型 int &#xff1a;整型 float &#xff1a;单精度浮点 4字节32位 double &…...

第十九章 Unity 其他 API

本节介绍一些其他经常使用的Unity类。首先&#xff0c;我们回顾一下Vector3向量类&#xff0c;它既可以表示方向&#xff0c;也可以表示大小。它在游戏中可以用来表示角色的位置&#xff0c;物体的移动/旋转&#xff0c;设置两个游戏对象之间的距离。在我们之前的课程中&#x…...

sha256算法详解,用C语言模拟sha256算法

SHA-256是一种加密算法,它可以将任意长度的数据块计算出一个固定长度的输出值,通常是256位。SHA-256具有以下特点: 1. 固定输出长度:SHA-256的输出长度为256位,不受输入数据的长度限制。 2. 不可逆性:SHA-256采用单向哈希函数,即无法从输出值反向推出输入数据。 3. 抗…...

前端技术未来发展展望

前端技术在未来的发展中将继续保持快速、变化多样和创新性强的趋势。以下是我认为前端技术未来发展的几个方向&#xff1a; 框架和库的演进&#xff1a;框架和库的更新换代将继续加速。React、Vue、Angular等主流框架的更新周期将会缩短&#xff0c;同时各自的生态系统也将更加…...

第四十六天|dp

今天的题还是完全背包的题 139. Word Break 这道题其实用deque也能做,但是需要cache去记录之前尝试过的值,.相对简单的办法就是用完全背包了 这道题worddict就是物品.我们的dp[i]代表到i为止是不是能满足题意分成segmentation 处置化全为false,但是dp[0]True.这是因为为0时…...

汇编语言-复习自用

本文用于自我复习汇编语言&#xff0c;参考b站一位老师的讲解整理而成&#xff0c;感谢老师的无私付出视频链接链接 文章目录 1.第一章1.1计算机组成1.2读取1.3 寄存器及数据存储1.4 mov和and指令1.5 确定物理地址1.6 内存分段表示法1.7debug使用1.8CS:IP1.9jmp指令改变csip1.1…...

Android moneky自动点击应用设想

近期又有人发错私密消息到群聊天里&#xff0c;造成巨大反应的事件&#xff0c;可谓是一失手成大恨&#xff0c;名利受损。 而如果手机里安装一个monkey自动点击程序&#xff0c;没事的时候&#xff0c;跑跑monkey&#xff0c;倒一杯茶&#xff0c;静静的看手机屏幕在那里点击&…...

16.基于主从博弈理论的共享储能与综合能源微网优化运行研究

说明书 MATLAB代码&#xff1a;基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词&#xff1a;主从博弈 共享储能 综合能源微网 优化调度 参考文档&#xff1a;《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现 仿真平台&#xff1a;MATLAB …...

使用 ESP32 设计智能手表第 2 部分 - 环境光和心率传感器

我们研究了如何为我们的智能手表项目制作一些有趣的表盘。在这一部分中,我们将研究如何将一些传感器连接到我们的智能手表,并将连接 BH1750 环境光传感器和 MAX30102 心率传感器。我们将分别研究这些模块中的每一个的接口。 先决条件——安装必要的库 本文下方提供的 GitHub …...

分布式事务 --- 理论基础、Seata架构、部署

一、分布式事务问题 1.1、本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2、分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&am…...

低代码开发重要工具:JVS列表页字段样式配置说明

列表页中&#xff0c;通常存在各种各样的样式控制&#xff0c;例如字段宽度需要可调、字段的颜色根据内容变化等&#xff0c;那么我们接下来介绍下字段的样式控制的内容以及对应的效果。 1、字段样式控制配置位置 进入列表页的 数据配置界面&#xff0c;每个字段可以有独立的配…...

explain结果字段分析

select_type simple&#xff1a;表示不需要union操作或者不包含子查询的简单select语句。有连接查询时&#xff0c;外层的查询为simple且只有一个。 primary&#xff1a;一个需要union操作或者含有子查询的select&#xff0c;位于最外层的单位查询的select_type即为primary且只…...

MySQL连接查询

MySQL连接查询 在多表联合查询时&#xff0c;为了减少查询的次数&#xff0c;使用连接查询可以一次查询多个相关联表的数据。 MySQL连接查询&#xff1a;分为内连接查询和外连接查询。 其中外连接查询又分成 left连接查询 和 right连接查询。 下午为两张数据库表&#xff0c;表…...

做自主外贸网站和后台费用多少/广州网站优化外包

素养1 站的高&#xff0c;看的远 投资如下棋&#xff0c;看不到三步&#xff0c;谈不上高手&#xff0c;真正的大师往往能看到七八步之后。 最优秀的投资人能预判五年以后的行业形势&#xff0c;并提前布局&#xff0c;软银的孙正义&#xff0c;投资日本雅虎、阿里巴巴等就是…...

建定制营销型网站/互联网营销师证书

CentOS7 特点总结CentOS7 特点总结1.runlevel/etc/inittab 中开启启动模式已失效&#xff0c;但还可以通过命令 init 0/1/2/3/4/5/6进行设置7版本中更新为systemctl set-default graphical.target (设置图形界 启动)&#xff0c;实际是在/etc/systemd/system/ 目录下创建指向/u…...

在线ps照片处理手机版/廊坊百度关键词优化怎么做

//来源&#xff1a;http://www.cnblogs.com/nbpowerboy/p/3380079.html 公司用SharePoint 2010已有三年多的时间了&#xff0c;上BPM项目也有2年多的时间&#xff0c;之前供应商的部署SharePoint数据库都在一个物理盘&#xff0c;数据库文件与日志文件没有进行分开存放到不同的…...

界面设计做的好的网站/写软文是什么意思

本文所用软件版本及下载地址&#xff1a; zookeeper : zookeeper-3.3.6 hadoop : hadoop-2.7.4 链接&#xff1a;https://pan.baidu.com/s/14InWWh2MVWw-0CIDMcypSA 密码&#xff1a;1l98 如果有不对的地方&#xff0c;请大家指正。谢谢 。 集群搭建步骤&#xff1a; 1.集…...

做烘培网站/网络运营推广是做什么的

基本 shell是一个C语言编写的程序,我们可以用这个应用程序来访问操作系统内核的服务 shell脚本 shell脚本,是一种为shell编写的脚本程序,我们平时说的shell一般都是在说写shell脚本,而不是开发shell 下面我们利用shell,编写一个脚本,使得以后在iOS开发中可以快速的创建一个项目…...

精美合同网站建设/最好的优化公司

DNS域名解析 简单的说就是把域名翻译成 IP 地址&#xff0c;但如果在浏览器直接输入IP&#xff0c;则跳过这个步骤。 DNS寻找解析顺序&#xff1a; 浏览器缓存解析 操作系统缓存解析 公共域名服务器解析&#xff08;根域名服务器/Root Server&#xff0c;主域名服务器&…...