java三大特性之【多态】

news2024/11/25 20:52:37

多态

    • 1.1 概念
    • 1.2 实现条件
    • 1.3 方法重写(override)与方法重载(overload)
    • 1.4 向上转型
    • 1.5 向下转型

1.1 概念

同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态。
举例说明:打印机进行打印
对于不同的打印机对象,使用相同的打印方法,表现出不同的行为。(黑白打印对象–>打印方法–>打印黑白的图像;彩色打印对象–>打印方法–>打印彩色的图像)
两不同,一相同
不同的对象,调用相同的方法,表现出不同的行为,称为多态!

1.2 实现条件

java中要想实现多态,必须同时满足以下三个条件,缺一不可:

  • 多态的实现必须依赖继承,在继承体系下才有多态。只有在继承关系的类之间才有多态可言。
  • 子类必须要覆写父类中的方法。
  • 通过父类的引用调用子类重写的方法。

Test类

public static void main()
{
	Cat cat=new Cat("yy",1);
	Dog dog=new Dog("xx",2);
	fun(cat);
	fun(dog);
}
public static void fun(Animal animal)
{
	animal.eat();
}

不同:调用fun()方法时,传入了不同的Animal对象
一个是Dog类对象;一个是Cat类对象
相同:调用的都是eat方法
不同:根据不同对象,表现出了不同的eat行为

1.3 方法重写(override)与方法重载(overload)

  1. 方法重写:在有继承关系的类之间,子类定义了和父类除了权限不同以外,其他(方法名称、参数列表、返回值类型(向上转型除外))完全相同的方法称为子类重写了父类的方法。子类重写方法的权限>=父类方法。

  2. 方法重载:在同一个类中,定义了一组方法名称相同,参数列表不同,与返回值无关的一组方法,称为重载方法。

  • 解释向上转型除外问题
    方法重写,返回值类型可以为向上转型类的返回值,父类方法返回父类对象,子类重写的方法返回子类对象,因为子类对象天然是父类引用(is an),本质上返回值类型相同。
    Animal类
{
	public Animal(){}
	public Animal test()
	{
		return new Animal;
	}
}

Dog类

{
	public Dog(){}
	//子类中重写test方法,返回值为向上转型类的返回值:Dog is an animal
	public Dog test()
	{
		return new Dog;
	}
}
  • 为什么重载没有权限问题?
    同一个类中,所有东西均可见,与权限无关。
  • 私有方法能否被重写?
    方法重写,不包含私有方法的重写。私有继承,子类中都不清楚父类中包含此方法,因此不能重写。
    所谓重写,在父类的现有方法上进行覆盖,前提是子类得清楚父类的方法。
  • static方法是否存在重写?
    不存在。首先,静态方法严格和类进行绑定,而多态即为不同的对象,而静态方法中就不包含对象的概念。
  • 构造方法能否被重写?
    不能。构造方法决定一个对象如何产生,如何赋值,不能在子类中给父类进行赋值操作。
    重写就是在子类中修改了父类的原有方法的表现,以当前子类对象的方法为准。
  1. 静态绑定 和 动态绑定
  • 静态绑定----方法重载编译时,编译器根据用户传参的不同决定到底调用的是哪个方法。
  • 动态绑定----方法重写:编译时无法确定到底调用的是哪个对象的 eat 方法,只有在运行时,根据具体传入的对象,才能决定到底调用的是哪个对象的 eat 方法,这叫做动态绑定。
    即:运行时才明确调用的是哪个方法
    在这里插入图片描述

1.4 向上转型

天然发生,且是之后产生对象的主要方式。
语法:父类名称 父类引用=new 子类实例

//从右向左读,Dog is an animal,天然发生的向上转型
Animal animal=new Dog("66",5);
  • 通过这个父类引用可以调用哪些属性和方法取决于父类中包含哪些属性和方法
  • 调用的方法表现出的行为,需要看new的是哪个子类对象

向上转型的优点:参数统一化!!!
假设需要定义fun函数来接收所有的Animal以及其子类对象,如果没有向上转型,则需要定义N个fun函数来接收对象。即为函数重载。会出现大量的代码冗余,不方便进行子类的扩展

在这里插入图片描述

存在向上转型则通过共同的父类引用animal来指向不同的子类对象,fun函数只需要定义一次。
在这里插入图片描述
缺点:只能调用所有子类共有的方法(在父类中定义了),子类独有的方法无法通过父类引用调用。

1.5 向下转型

语法:子类名称 子类引用=(子类名称)父类引用
要发生向下转型,必须先发生向上转型,否则会报错。需要强制类型转换,属于将大类型强制转换为小类型。

//大类型的引用指向小类型,需要强转,但是不一定成功
//除非animal引用本来就指向的是Dog对象才能转换
Dog dog =(Dog) animal

在这里插入图片描述
父类引用本身就指向的是子类对象,向下转型才能还原为当前这个子类引用;
反之,如果指向的不是子类对象,则无法向下转型,抛出类型转换异常ClassCaseException
在这里插入图片描述
可以使用Java中提供的关键字instanceof来判断一个父类引用是否指向了一个子类实例
语法:引用名称 instanceof 类
返回值:布尔类型
在这里插入图片描述

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

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

相关文章

今天就详细告诉你发票识别软件能识别哪些内容

既然大家点进这篇文章,说明大家对增值税发票识别技术非常感兴趣。本文会先介绍增值税发票识别技术的相关知识,然后再具体介绍识别增值税发票的软件有哪些。 增值税发票识别技术是一种基于图像识别和深度学习算法的自动化技术,它可以快速准确…

AI问答:前端需要掌握的设计模式/vue项目使用了哪些设计模式/vue项目开发可以使用哪些设计模式

一、理解什么是设计模式 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。 设计模式是一个在软件设计领域中被广泛应用的概念,它指的是一套被公认为有效的解决特定问题的设计思路和方法。 设计模式更多的是指导思想和方法论,而不是现…

零基础学 MySQL(基础版)

零基础学 MySQL(基础版) 1. 引出 思考一个问题: 淘宝网,京东、微信,抖音 都有各自的功能,那么当我们退出系统的时候,下次再访问时,为什么信息还存在? 2. 解决之道 2.1 解决之道—文件、数据库 为了解决上述问题&…

chatgpt赋能python:Introduction

Introduction 在机器学习中,模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数,以便能够准确地预测未来的值。Python是一种功能强大的编程语言,提供许多库和框架来训练机器学习模型。在本文中,我们将探讨如何…

FFmpeg编程入门

标题 播放器框架常用音视频术语解复用器和编解码器FFmpeg库简介FFmpeg有8个常用库: FFmpeg函数简介封装格式相关编解码器相关 FFmpeg数据结构简介关系数据结构分析 播放器框架 流程:媒体文件通过复用器将音频流,视频流,字幕流分离…

iCache dCache

前言 CPU 和 RAM 之间存在多级高速缓存,一般分为 3 级,分别是 L1、L2、L3。 另外,我们的代码都是由两部分组成的:指令、数据。 L1 Cache 比较特殊,每个 CPU 会有两个 L1 Cache,分别为 iCache(指…

互联网 Java 工程师高级面试八股文汇总(1260 道题目附解析)

今年的行情,让招聘面试变得雪上加霜。已经有不少大厂,如腾讯、字节跳动的招聘名额明显减少,面试门槛却一再拔高,如果不用心准备,很可能就被面试官怼得哑口无言,甚至失去了难得的机会。 现如今,…

苹果将在 iOS 17 引入新功能,Safari隐私浏览有重大更新

苹果公司正在对Safari隐私浏览系统进行重大更新,为用户在浏览网页时提供更好的保护,防止第三方跟踪器。 iPhone制造商说:先进的跟踪和指纹保护有助于防止网站使用最新的技术来跟踪或识别用户的设备。隐私浏览现在可以在不使用时锁定&#xf…

MODIS数据下载

MODIS数据常用下载网址: Find Data - LAADS DAAC 在下载之前需要注册一个账号,才可进行下载。 1.选择数据产品,本人选取MOD09Q1数据产品(250m8天合成的反射率数据) 2.设置时间限制如下 3.找到感研究区域所在的位置&…

chatgpt赋能python:Python怎么拦截Windows浏览器的请求

Python怎么拦截Windows浏览器的请求 Python是一种流行的编程语言,并且被广泛用于Web开发。在这篇文章中,我们将深入探讨Python如何拦截Windows浏览器的请求。 什么是拦截请求? 拦截请求是指在网络传输过程中,对请求进行截获并进行处理的过…

C++结构体

目录 一、结构体的概念 二、结构体定义和使用 三、结构体数组 四、结构体指针 五、结构体嵌套结构体 六、结构体做函数参数 七、结构体中const使用场景 一、结构体的概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 二、结构体定义和使用 语法&…

对称二叉树(C++)

题目描述 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1. 二叉树; 2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。 下图中节点内的数字为权值,节点外的 id 表示节点编号。 现在给出一棵二叉…

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏&文章相关导读 1. Maven系列专栏…

用了【WRITE-BUG数字空间】,其他文档软件可以卸载、注销账号了

都3202年了文档都进化成在线协同编辑文档了 让我看看谁还在用本地软件写文档啊~滋滋滋 使用【WRITE-BUG数字空间】云文档全键盘写作不是梦!铁汁,听我句劝,把本地软件卸载了奥,你把握不住~ 程序员兄弟姐妹们的最爱编辑器&#x…

Zotero jasminum茉莉花插件

github地址:https://github.com/l0o0/jasminum 一个简单的Zotero 插件,用于识别中文元数据 非常感谢作者开发了这么好用的工具 安装步骤 首先要安装zotero 下载茉莉花插件安装包 https://github.com/l0o0/jasminum/releases 下载这个xpi格式的文件…

chatgpt赋能python:Python怎么抢优惠券?优惠不再是梦想!

Python怎么抢优惠券?优惠不再是梦想! 在如今的消费社会,优惠券已成为人们购物时追逐的目标。而优惠券的数量有限且抢手,往往仅能在短时间内领取,因此初次抢到心仪的优惠券可谓令人欣喜不已。而对于程序员们而言&#…

《springboot使用篇》——只为使用,一篇就够

目录 环境: spring boot概述 一,springboot快速入门 1.创建maven项目 2.引入起步依赖 3.自定义controller 4.编写启动类 5.开始测试 二.快捷方式创建sprinboot工程 补充 三,配置文件 1.配置文件之间的关系 2.yml配置文件 1.基本…

【ROS】ROS+Gazebo强化学习:训练

1、安装ROS1 【ROS】Ubuntu20.04安装ROS1 2、安装Anaconda 【AI】PyTorch入门(一):通过Anaconda安装PyTorch 【PyThon】Anaconda常用命令 3、源码下载 使用论文 Goal-Driven Autonomous Exploration Through Deep Reinforcement Learnin…

VMware虚拟机安装win10系统教程

执行本教程前请依次阅读以下2篇文章,完成环境准备: 1.VMware虚拟机下载安装教程【详细步骤 - 图文结合】 VMware虚拟机下载安装教程【详细步骤 - 图文结合】_西晋的no1的博客-CSDN博客 2.如何在微软官网下载win10镜像文件 如何在微软官网下载win10镜像文…

IDEA中Node.js环境下npm报错Error:0308010C:digital envelope routines:unsupported

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是目前最流行的Node.js 的包管理器。 一、安装nod…