java三大特性之【多态】

多态

    • 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 类
返回值:布尔类型
在这里插入图片描述

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

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

相关文章

二叉搜索树之AVL树

目录 1.概念 2.定义 3.插入 4.旋转 1. 新节点插入较高左子树的左侧---右单旋 2. 新节点插入较高右子树的右侧---左单旋 3. 新节点插入较高左子树的右侧:先左单旋再右单旋【左右双旋】 4. 新节点插入较高右子树的左侧---右左:先右单旋再左单旋【右…

I.MX6ULL_Linux_驱动篇(37) linux系统定时器

定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数,比如微秒、纳秒、毫秒延时函数…

Car Guide

文章目录 科目一第一章 机动车驾驶证申领和使用规定第一节 驾驶证的许可?种类和有效期第二节 驾驶证的申领第三节 驾驶证的使用第四节 驾驶考试第五节 违法记分制度 第二章 交通信号第一节 交通信号灯第二节 交通标志第三节 交通标线第四节 交警手势 第三章 道路交通…

【编程语言 · C语言 · 递归函数】

递归函数 C 语言的函数都支持递归, 也就是说,每个函数都可以直接或者间接第调用自己。所谓的间接调用,是指在递归函数调用的下层函数中再调用自己。 递归关系图如下: 递归之所以能实现,是因为函数的每个执行过程在栈中都有自己的…

Redis从入门到精通之底层数据结构快表QuickList详解

文章目录 0.前言1. 快表的结构2. Redis 6.0 快表quicklist 基本结构2.1 成员变量2.1 主要操作2.1 推导结果 3. 快表的操作 3. 快表的优缺点3.1 优点:3.2 缺点: 5. Redis从入门到精通系列文章 0.前言 上个篇章回顾,我们上个章节,讲…

Win10 系统专业版远程桌面如何才能多用户同时登录使用?

环境: Win10专业版19041 RDPWrap-v1.6.2 dell5493笔记本 问题描述: Win10 系统专业版远程桌面如何才能多用户同时登录使用? 解决方案: 安装RDPWrap 1.关闭remote desktop services服务 安装RDP之前,要先关闭re…

Kuberentes,k8s诞生简介

一、前言 什么是k8s? Kuberentes 是基于容器的集群管理平台,它的简称,是K8S。有人说之所以叫k8s,是因为k到s中间有8个字母,因此叫k8s,也有人说,在使用k8s的安装配置流程中,共分为8…

验证attention是否在图像分类问题上起决定性作用

来源:投稿 作者:摩卡 编辑:学姐 Motivation 现阶段出现了大量的Transformer-style图像分类模型,并且这些模型在ImageNet上取得了不俗的成绩,这些Transformer-style模型将取得高性能的功劳归功于Multi-head attention注…

12.异常检测

12.1 异常检测的应用 异常检测最常见的应用是欺诈检测; 如果你有很多用户,每个用户都在从事不同的的活动,你可以对不同的用户活动计算特征变量,然后可以建立一个模型来表示用户表现出各种行为的可能性,用来表示用户行…

微服务 springcloud 05 hystrix框架,降级,可视化Hystrix dashboard 仪表盘,熔断

01.微服务宕机时,ribbon 无法转发请求 关闭 user-service 和 order-service 02.hystrix框架 03.创建hystrix项目,hystrix与ribbon经常一起出现 第一步:复制 sp06-ribbon 项目,命名为sp07-hystrix 选择 sp06-ribbon 项目&#…

高并发架构设计方法

我们知道,“高并发”是现在系统架构设计的核心关键词。一个架构师如果设计、开发的系统不支持高并发,那简直不好意思跟同行讨论。但事实上,在架构设计领域,高并发的历史非常短暂,这一架构特性是随着互联网,…

【JVM】日志分析工具--gcviewer的使用

文章目录 gcviewer是什么?gcviewer的使用最后 gcviewer是什么? GCViewer是一个小工具,可以可视化Sun / Oracle、IBM、HP和BEA Java虚拟机生成的详细GC输出。它是在GNU LGPL下发布的自由软件。—官网翻译 gcviewer的使用 文章使用的配置 工具…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子,一直搞考研的东西,实在是无聊。所以顺便把工程上的东西,拿来…

探索Redis内部数据结构

Redis支持多种数据结构,每种数据结构都有其特定的用途。下面对Redis支持的主要数据结构进行详细阐述: 一、字符串(String) 字符串是Redis最基本的数据结构,可以存储一个字符串或者二进制数据,例如图片、序…

HID协议学习

HID协议学习 0. 文档资料 USB_HID协议中文版_USB接口HID设备_AUJsRmB9kg.pdf HID报告描述符精细说明_mgCxM8_ci9.pdf hut1_22_U3cvnwn_ZZ.pdf 1. 基本概念 HID协议是一种基于USB的通讯协议,用于在计算机和输入设备之间进行数据传输。HID协议定义了标准的数据格…

如何实现在线书签内容替换

书签广泛应用于企业的各种办公自动化业务场景中。例如:在范式合同模板中将甲乙方书签自动替换成具体的公司名称;在红头文件模板中将红头标题书签替换成具体的行政指令;在各种协议模板中将协议日期书签替换为当前日期;等等。 在这…

【Elacticsearch】 原理/数据结构/面试经典问题整理

对Elacticsearch 原理/数据结构/面试经典问题整理的文章; 映射 | Elasticsearch: 权威指南 | Elastic Elacticsearch介绍 Elasticsearch,这里简称ES。ES是一个开源的高可用高扩展的分布式全文搜索与分析引擎,可以提供PB级近实时的数据存储和检索能力&am…

《离散数学》:集合、关系和函数

〇、前言 这章将会对集合、以及集合之上的关系、以及两个集合之间的映射情况做一个细致的讨论。集合作为数学和其他领域中的基础概念,具有广泛的应用和重要的地位。它为数学建立了基本的体系和推理方法,为各个领域的研究和应用提供了一种统一的描述和分…

基于web漏洞扫描及分析系统设计_kaic

基于web漏洞扫描及分析系统设计 摘 要 随着信息技术的发展和网络应用在我国的普及,针对我国境内信息系统的恶意网络攻击也越来越多,并且随着黑客攻击技术的不断地更新,网络犯罪行为变得越来越难以应对,用户日常访问的网站是否安全…

Mysql主从复制及读写分离

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…