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

什么是多态

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

代码演示:

首先创建类:

public class People {   //人类
    public String name = "people";
    public void run(){  //跑步
        System.out.println("人会跑步");
    }
}

public class Student extends People{    //学生类,继承人类
    public String name = "student";
    @Override
    public void run() { //跑步
        System.out.println("学生跑的贼快~");
    }
}

public class Teacher extends People{    //老师类,继承人类
    public String name = "teacher";
    @Override
    public 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关键字,判断当前对象的真实类型,再进行强转

示例:

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空间计算时代催生新一波巨大算力市场需求

什么是空间计算? 空间计算是一种整合虚拟现实(VR)、增强现实(AR)、混合现实(MR)等技术的计算模式,旨在将数字信息与真实世界融合在一起。这种融合创造了一个全新的计算环境&#xff…

优惠券兑换码生成需求——事务失效问题分析

前段时间收到一个优惠券兑换码的需求:管理后台针对一个优惠券发起批量生成兑换码,这些兑换码可以导出分发到各个合作渠道(比如:抖音、京东等),用户通过这些渠道获取到兑换码之后,再登录到我司研…

将Android应用修改为鸿蒙应用的工作

将Android应用修改为鸿蒙(HarmonyOS)应用需要进行一系列主要的工作。以下是在进行这一转换过程中可能需要进行的主要工作,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.项目…

Vue2x的自定义指令和render函数使用自定义指令

在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。 定义指令 常用两种方式进行…

【天龙怀旧服】攻略day7

关键字: 新星1.49、金针渡劫、10灵 1】新星(苍山破煞) 周三周六限定副本,19.00-24.00 通常刷1.49w,刷149点元佑碎金 boss选择通常为狂鬼难度,八风不动即放大不选,第二排第一个也不选&#xf…

SAP SD-DN-MM 交货单相关物料凭证的视图的日期问题

眼下有个需求 获取交货单对应的物料凭证的过账日期BLDAT。 同步BW数据过去 新增一个数据库视图 但是实际使用时,有效部分仅本月,再选择条件里面要加上 MATdoc-bldat > sy-datum - sydatum6(2). 于是使用ST05 跟踪了一下,发现在DD28S…

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求:假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?  分析:这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

【ROS2】使用C++实现简单的发布订阅方

1 构建自定义数据类型 1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢?Dataset和DataLoader的作用是什么,我们如何构建自己的Dataset和DataLoader?神经网络的一般构造方法&…

机器学习~从入门到精通(三)梯度下降法

一、梯度下降法 # 梯度下降不是一种算法,是一种最优化方法 # 上节课讲解的梯度下降的案例 是一个简单的一元二次方程 # 最简单的线性回归:只有一个特征的线性回归,有两个theta # 二、在多元线性回归中使用梯度下降求解 三、### R…

泊松流生成模型简介

一、说明 泊松流生成模型 (PFGM) 是一种新型的生成深度学习模型,与扩散模型类似,其灵感来自物理学。在这本简单易懂的指南中了解 PFGM 背后的理论以及如何使用它们生成图像。 生成式人工智能模型在过去几年中取得了长足的进步。受物理启发的扩散…

使用pygame实现简单的烟花效果

import pygame import sys import random import math# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Fireworks Explosion")# 定义颜色 black (0, 0, 0) wh…

BLDC 电机和 PMSM 的结构区别

BLDC 电机和 PMSM 的结构类似,其永磁体均置于转子,并被定义为同步电机。在同步电机中,转子与定子磁场同步,即转子的旋转速度与定子磁场相同。它们的主要区别在于其反电动势(反 EMF)的形状。电机在旋转时充当…

MySQL进阶篇(五) 锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

基于JavaWeb的酒店管理系统

基于JavaWeb的酒店管理系统 文章目录 基于JavaWeb的酒店管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 基于JavaWeb的酒店管理系统是为酒店打造的管理平台,其主要功能有管理员登陆、客房预订、客房入住、房间管理、数据查询(预订单查询、入…

ros2 基础学习 15- URDF:机器人建模方法

URDF:机器人建模方法 ROS是机器人操作系统,当然要给机器人使用啦,不过在使用之前,还得让ROS认识下我们使用的机器人,如何把一个机器人介绍给ROS呢? 为此,ROS专门提供了一种机器人建模方法——…

数据结构.线性表(2)

一、模板 例子: a: b: 二、基本操作的实现 (1)初始化 (2)销毁和清空 (3)求长度和判断是否为空 (4)取值 (5)查找 (6)插入 &…

【rust/bevy】从game template开始

目录 说在前面步骤进入3D控制方块问题 说在前面 操作系统:win11rust版本:rustc 1.77.0-nightlybevy版本:0.12 步骤 rust安装 这里 windows下建议使用msvc版本bevy安装 这里clone代码git clone https://github.com/NiklasEi/bevy_game_templa…

Jetpack Flow 、Room 初学者学习记录

学习使用响应式Flow操作数据,记录自己学习的过程。 ContactViewModel 是一个 ViewModel,它依赖于一个Room操作接口 ContactDao ,访问对象来获取联系人数据。它使用了 StateFlow 来处理状态的变化和数据的更新。ViewModels 通常用于管理应用的…

emc防护原理

emc原理 emc设计的根本是对于干扰电流的阻塞和疏导。通过阻抗变化来实现对于特定频率的电流的防护。 emc设计 在485等信号线emc实验中,一般使用8us/20us的脉冲波形进行浪涌信号线实验即可。在特殊场景(军品)会使用到更高等级的浪涌实验&am…