面向对象三大特征之三:多态--java学习笔记

什么是多态

  • 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态
    对象多态:举个栗子,比如一个人,他可以是一个老师,也可以是一个歌手,也可以是一个丈夫......
    行为多态:举个栗子,比如都是人来唱歌,有的人唱的很好听,有的五音不全,或者说都是去上学,有的是学霸,而有的是学渣......

代码演示:

首先创建类:

public class People {   //人类public String name = "people";public void run(){  //跑步System.out.println("人会跑步");}
}public class Student extends People{    //学生类,继承人类public String name = "student";@Overridepublic void run() { //跑步System.out.println("学生跑的贼快~");}
}public class Teacher extends People{    //老师类,继承人类public String name = "teacher";@Overridepublic void run() { //跑步System.out.println("老师跑的气喘吁吁~");}
}

Test:

public class Test {public static void main(String[] args) {People s = new Student();   //对象多态,人可以是学生,人的范围比学生大,学生继承自人,学生也是人s.run();    //学生跑步People t = new Teacher();   //同理学生t.run();    //老师跑步}
}

运行结果:

 

 多态的前提

  •  有继承/实现关系,存在父类引用子类对象,存在方法重写

多态注意事项 

  • 多态强调对象和行为多态性,类中的属性(成员变量)不谈多态
  • 对于方法/行为,编译看左边,运行看右边,即编译看父类,实际运行看子类
  • 对于成员变量/属性,编译看左边,运行仍看左边,即编译看父类,实际运行也是父类的
  • 这里的左边右边是指对象定义时赋值=号的左边右边

举例:

仍然是刚才的人类、学生类、老师类 ,输出他们的name:

public class Test2 {public static void main(String[] args) {People s = new Student();System.out.println(s.name); //编译看左边,运行看左边People t = new Teacher();System.out.println(t.name);}
}

结果:

 

使用多态的好处

  • 在多态形式下,右边对象是解耦合的,更便于维护和拓展
  • 定义方法时,使用父类类型的形参,可以接收一切子类对象,拓展性更强、更便利
    解耦合:右边对象随时切换,后续业务随时改变

多态的存在的问题 

  • 无法直接调用子类独有功能

多态下的类型转换 

类型转换

  • 自动类型转换:父类 变量名 = new 子类(); 例如 People p = new Teacher
  • 强制类型转换:子类 变量名 = (子类) 父类变量;例如 Teacher t = (Teacher)p;

强制类型转换的注意事项 

  • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
  • 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误,即只能强制转换成多态定义时指向的子类

示例:

  •  因此,强转前建议使用instanceof关键字,判断当前对象的真实类型,再进行强转

示例:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP反序列化总结4--原生类总结

原生类的简要介绍以及原生类和反序列化的关系 PHP 原生类指的是 PHP 内置的类,它们可以直接在 PHP 代码中使用且无需安装或导入任何库,相当于代码中的内置方法例如echo ,print等等可以直接调用,但是原生类就是可以就直接php中直接…

jmeter分布式服务搭建

目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了

​想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…

堆排序——高效解决TOP-K问题

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言什么是堆?建堆堆排序:排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

SpringBoot+Vue实现对称加密和非对称加密

我们先来了解一下什么是对称加密和非对称加密,以及两者的优缺点 对称加密 使用同一个密钥对消息进行加密解密 优点:加密和解密的速度快,适合于数据量大的加解密 缺点:密钥在网络传输中可能被泄露,因此安全性相对较低…

C++核心编程三:函数提高(持续更新)

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🌙C核心编程🌏1 函数提高🎄1.1 函数默认参数🎄1.2 函数占位参数🎄1.3 函数重载🍉1.3.1 函数重载概述&…

护眼灯有蓝光吗?防蓝光护眼台灯推荐

护眼台灯是家长为孩子购买的常见用品之一,但对于它的了解却不够深入,很多人购买之后反而容易出现眼睛疲劳、不适的情况!据了解,主要的原因是因为在选择护眼台灯时,大多数人没有专业知识,没有买到合适的护眼…

012集:三目运算符实例讲解(if else)及for、while循环—python基础入门实例

Python也有自己的三目运算符: 条件为真时的结果 if 判段的条件 else 条件为假时的结果 即:Python可以通过if语句来实现三目运算符的功能,因此可以把这种if语句当做三目运算符,具体语法格式如下: 返回True执行 if 表达…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时,图片的上传和存放是一个问题,使用小众第三方图床,怕不稳定和倒闭&…

.net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别

//全局过滤器 builder.Services.AddMvc(m > { m.Filters.Add<AllResultFilter>(); }); 1、实现过滤器 public class AllResultFilter : IResultFilter {/// <summary>/// 结果执行后方法/// 不可更改结果/// </summary>/// <param name"con…

springboot+mysql大学生就业推荐系统-计算机毕业设计源码01535

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生就业管理等问题&#xff0c;对学生就业…

扒开MySQL的源码,探索MVCC实现方式

下载MySQL源码 没有什么比源码更靠谱的了&#xff0c;所以我们先把源码下载下来&#xff0c;后期验证使用MySQL源码下载 MVCC是什么 mvvc全称是multi-version concurrency control&#xff08;多版本并发控制&#xff09;&#xff0c;主要用于处理读写并发冲突的问题。 MVC…

大数据开发之Hive(企业级调优)

第 10 章&#xff1a;企业级调优 创建测试用例 1、建大表、小表和JOIN后表的语句 // 创建大表 create table bigtable(id bigint, t bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by \t; //…

Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

什么是 Swagger? Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。它提供了一种规范的方式来定义、构建和文档化 RESTful Web 服务&#xff0c;使客户端能够发现和理解各种服务的功能。Swagger 的目标是使部署管理和使用功…

Halcon滤波器 laplace 算子

Halcon滤波器 laplace 算子 使用laplace 算子对图像进行二次求导&#xff0c;会在边缘产生零点&#xff0c;因此该算子常常与zero_crossing算子配合使用。求出这些零点&#xff0c;也就得到了图像的边缘。同时&#xff0c;由于laplace算子对孤立像素的响应要比对边缘或线的响应…

【SpringBoot系列】JDK动态代理

🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收…

kafka除了作为消息队列还能做什么?

Kafka 最初是为大规模处理日志而构建的。它可以保留消息直到过期&#xff0c;并让各个消费者按照自己的节奏提取消息。 与其之前的竞品不同&#xff0c;Kafka 不仅仅是一个消息队列&#xff0c;它还是一个适用于各种情况的开源事件流平台。 让我们回顾一下流行的 Kafka 用例。 …

C语言经典算法之冒泡排序算法

目录 前言 建议&#xff1a; 简介&#xff1a; 一、代码实现 二、时空复杂度 时间复杂度&#xff1a; 空间复杂度&#xff1a; 总结&#xff1a; 前言 建议&#xff1a; 1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住算法。 2.建议读者学习算法的时候…

CNN:Convolutional Neural Network(下)

目录 1 CNN 学到的是什么 1.1 Convolution 中的参数 1.2 FFN 中的参数 1.3 Output 2 Deep Dream 3 Deep Style 4 More Application 4.1 AlphaGo 4.2 Speech 4.3 Text 原视频&#xff1a;李宏毅 2020&#xff1a;Convolutional Neural Network 本博客属于学…

计算机毕业设计----SSH实现简单在线听音乐收藏管理系统

项目介绍 项目分为管理员与普通用户两种角色&#xff0c; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,歌曲管理等功能。 用户角色包含以下功能&#xff1a; 按分类查看,添加歌单,用户登录等功能。 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&…