Java进阶----多态

多态

什么是多态

在继承父类或者实现接口的基础上,允许同一类事物出现不同的状态
多态的前提:继承或实现的关系、方法的重写、父类(接口)引用指向子类(实现类)对象

表现形式

父类 变量 = 子类对象();
接口 变量 = 实现对象();

需求:

  • 定义Animal动物类作为父类,规定吃饭、喝水功能。
  • 定义子类Dog和Cat,分别创建Dog对象和Cat对象,调用吃饭功能和喝水功能

思考:
1.定义Animal动物类,作为父类
2.定义Dog狗类和Cat猫类,作为子类
3.分别创建Dog和Cat对象,调用吃饭、喝水功能

/*** 动物类,作为父类的*/
public abstract class Animal {//喝水public void drink() {System.out.println("喝水");}//吃饭public abstract void eat();
}
/*** 猫类*/
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
/*** 狗类,作为子类*/
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}
}

之前的想法:

Dog dog = new Dog();
Cat cat = new Cat();

引入多态的思想:

//允许将子类对象,给父类类型变量赋值
//将dog和cat变量变成同一类型
Animal dog = new Dog();
Animal cat = new Cat();//呈现相同状态
dog.drink();
cat.drink();
//呈现不同状态
dog.eat();
cat.eat();

多态关系中,成员的访问特点

目标:了解多态中成员的访问特点

  • 方法调用:编译看左边,运行看右边
  • 变量调用:编译看左边,运行也看左边

需求:有父类Fu和子类Zi,请使用多态的形式创建对象并访问各自属性和方法

//父类
public class Fu {String field = "父类属性";public void method() {System.out.println("父类方法");}
}//子类
public class Zi extends Fu {String field = "子类属性";String ziField = "子类特有属性";public void method() {System.out.println("子类方法");}public void ziMethod() {System.out.println("子类特有方法");}
}
public static void main(String[] args) {/*** 多态中成员访问特点:*      变量调用:编译看左边,运行也看左边*      方法调用:编译看左边,运行看右边** 需求:有父类Fu和子类Zi,请使用多态的形式创建对象并访问各自属性和方法*///1.用多态的代码形式创建Zi对象,给Fu类型变量赋值Fu zi = new Zi();//2.访问父类和子类都有(同名)的属性System.out.println(zi.field);//结果: 父类属性//3.访问父类没有但子类有的属性//System.out.println(zi.ziField);//报错//访问变量:编译看左边,运行也看左边System.out.println("-------------------");//4.访问父类和子类都有(同名)的方法zi.method();//结果: 子类方法//5.访问父类没有但子类有的方法//zi.ziMethod();//报错//访问方法:编译看左边,运行看右边}

多态好处与弊端

优势:解耦合,提高方法的扩展性,把方法的形参写成父类/接口类型,调用方法的时候可以传递子类/实现类对象
劣势:多态下不能使用子类的特有功能

需求:利用多态技术优化useDog和useCat方法,使两个方法变为一个方法!
public abstract class Animal {public void drink() {System.out.println("喝水!");}public abstract void eat();
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}//猫类特有功能:抓老鼠public void catchMouse() {System.out.println("猫抓老鼠");}
}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}//狗类特有功能:狗看家public void lookHome() {System.out.println("狗看家");}
}
public static void main(String[] args) {feedAnimal(new Dog());feedAnimal(new Cat());
}public static void feedAnimal(Animal animal) {animal.eat();//2.尝试访问子类的特有功能,失败报错//访问:狗看家//animal.lookHome();//访问:猫抓老鼠//animal.catchMouse();//多态的弊端:在多态形式下,不能访问子类的特有功能}

多态的转型

目标:了解多态下引用数据类型的类型转换操作

多态转型指的是:把父类类型强制转换为子类类型
格式:子类  变量 = (子类)被转换的数据;
原本是什么类型,才能还原为什么类型
Animal   a  =  new Dog();
Dog d = (Dog)a;

instanceof关键字

作用:测试它左边的对象是否是它右边的类的实例

if( a instanceof Dog ){Dog d = (Dog)a;d.lookHome();}

目标:了解多态下引用数据类型的类型转换操作

public static void useAnimal(Animal animal) {animal.eat();//1.强转成Dog狗类型//Dog dog = (Dog) animal;//调用狗的特有功能//dog.lookHome();//2.正确的强转方案:先判断,后强转。使用instanceofif (animal instanceof Dog) {Dog dog = (Dog) animal;dog.lookHome();}//3.在高版本的jdk中,上面的代码可以进一步简化if (animal instanceof Cat cat) {cat.catchMouse();}}
小结
  1. 多态的形式有表现形式有两种
    父类变量接收__子类对象
    接口变量接收__实现类对象
  2. 多态的好处是什么?
    如果方法的参数是父类类型,那么调用方法可以传递子类对象
    如果方法的参数是接口类型,那么调用方法可以传递实现类对象______
  3. 多态的弊端是什么?
    在多态的情况下,不能调用子类或者实现类的_特有方法

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

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

相关文章

解决方案架构师系列 - AWS - AWS Amplify 服务功能介绍

探索AWS Amplify:构建高效、安全的云原生应用 AWS Amplify 是一个开源框架,由亚马逊网络服务(AWS)提供,旨在简化Web和移动应用程序的开发。它是一套完整的开发工具集合,帮助开发者快速地实现功能如身份验证…

CycleGAN深度学习项目

远程仓库 leftthomas/CycleGAN: A PyTorch implementation of CycleGAN based on ICCV 2017 paper "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks" (github.com) 运行准备 Anaconda 安装需要的库 指令 pip install panda…

LPRNet 车牌识别部署 rk3588(pt-onnx-rknn)包含各个步骤完整代码

虽然车牌识别技术很成熟了,但完全没有接触过。一直想搞一下、整一下、试一下、折腾一下,工作之余找了一个简单的例子入个门。本博客简单记录一下 LPRNet 车牌识别部署 rk3588流程,训练参考 LPRNet 官方代码。 1、导出onnx   导出onnx很容易…

昇思25天打卡营-mindspore-ML- Day24-基于 MindSpore 实现 BERT 对话情绪识别

学习笔记:基于MindSpore实现BERT对话情绪识别 算法原理 BERT(Bidirectional Encoder Representations from Transformers)是由Google于2018年开发的一种预训练语言表示模型。BERT的核心原理是通过在大量文本上预训练深度双向表示&#xff0…

Win7电脑修改网卡配置连接千兆网络的方法

Win7电脑修改网卡配置连接千兆网络的方法 Realtek PCIe GBE Family Controller是千兆网卡,GBE的意思就是1Gbps网卡,也就是千兆网卡,翻译成中文就是瑞昱PCI-E总线千兆网络系列控制器。 目前有很多的电脑都是使用realtek网卡的,当时奇怪的是网卡连接到h3或者d-link千兆交换机…

探索老年综合评估实训室的功能与价值

一、引言 随着人口老龄化的加剧,老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所,具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 (一)健康评估功能 1、身体功能评估 通过专业设…

【postgresql】权限(Privileges)

权限(privileges)是决定用户或角色可以对数据库对象(如表、视图、序列和函数)执行哪些操作的许可。权限对于维护安全性和控制对数据的访问至关重要。 权限分类 在 PostgreSQL 中,权限分为以下几种: SELEC…

数据库基本查询(表的增删查改)

一、增加 1、添加信息 insert 语法 insert into table_name (列名) values (列数据1,列数据2,列数据3...) 若插入时主键或唯一键冲突就无法插入。 但如果我们就是要修改一列信息也可以用insert insert into table_name (列名) values (列数据1&am…

客户端通过服务器进行TCP通信(三)

一. 对TCP的基础讲解 服务端 1. 首先创建一个套接字,TCP是面向字节流的套接字,故需要使用SOCK_STREAM 2. 然后使用bind()函数将套接字与服务器地址关联(如果是在本地测试,直接将地址设置为217.0.0.1或者localhost,端口号为1000…

内存函数(C语言)

内存函数 以下函数的头文件:string.h 针对内存块进行处理的函数 memcpy 函数原型: void* memcpy(void* destination, const void* source, size_t num);目标空间地址 源空间地址num,被拷贝的字节个数 返回目标空间的起始地…

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持,成为了自动化脚本编写的首选语言之一。在这篇文章中,我们将探索如何使用Python来编写自动化脚本,以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…

在 YAML 中的变量(使用 和 * 定义及引用变量)

在 YAML 文件中,使用 & 和 * 是一种常见的定义和引用变量的方式。也是最简单的方式 使用 & 定义变量 在 YAML 中,& 符号用于定义一个锚点(anchor),也就是一个命名的变量。这个变量可以在文件的其他地方被引用和复用。 例如: title: &sc test在这个例子中,t…

1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

1、基于长短记忆网络(LSTM)的发动机剩余寿命预测的原理及流程 基于长短期记忆网络(LSTM)的发动机剩余寿命预测是一种常见的机器学习应用,用于分析和预测发动机或其他设备的剩余可用寿命。下面是LSTM用于发动机剩余寿命预测的原理和流程: 数据收集&#…

【Linux】 GCC/G++与Makefile使用

Linux GCC/G使用 GCC如何完成 格式:gcc [选项] 要编译的文件 [选项] [目标文件] 常用选项: -E:让gcc在预处理结束后停止编译过程,输出.i的C语言原始文件。-S:该选项只是进行编译而不是进行汇编,最终生成汇…

(leetcode学习)16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1: 输入:nums [-1,2,1,-4], target 1 输出:2 解…

力扣144题:二叉树的先序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…

C++入门学习——初始化列表

概念 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式 class Date { public://初始化列表Date(int year,int month,int day):_year(year),_month(month),_d…

[Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88

描述 对于经常在互联网上进行操作的学生,白领等! 一款好用的软件总是能得心应手,事半功倍。 今天给大家带了一款高科技软件 管视频下载神器 无需额外付费,永久免费! 亲测可运行!! 内容 目前主…

高德地图显示圆形区域并在区域边上标注半径

bug:循环创建三个圆形区域 ,数组设置为[{raduis:500,color:“#FF0000”}],然后循环取颜色会莫名其妙报错修改为 strokeColor: [“#FF0000”, “#1EE3C2”, “#3772E9”][i]即可 initAMap() {AMapLoader.load({key: "130cca3be68a2ff0fd5…

Eureka服务发现深度配置:实例ID与租约续期策略

Eureka服务发现深度配置:实例ID与租约续期策略 在微服务架构中,服务注册与发现是保证服务间相互发现和通信的基础。Netflix Eureka作为广泛使用的服务注册中心,提供了丰富的配置选项来满足不同场景下的需求。其中,服务实例ID和租…