27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录

27.1为什么使用多态?

 27.1.2什么是多态

 27.1.3对象多态

 27.1.4多态的使用前提

27.2 向上转型

27.3向下转型

 (面试题)

 27.4抽象类和抽象方法

特点(面试题):


27.1为什么使用多态?

需求1:动物园让我们实现一个功能: 创建一个狗类 ,狗有eat()方法,再创建一个饲养员类,饲养

员有一个feed()方法,让饲养员喂养狗。

 

Dog:
public class Dog {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat(){System.out.println(name+"狗吃奥里给");}
}

 

Feeder
public class Test01 {public static void main(String[] args) {Dog dog=new Dog();dog.setName("Jerry");Feeder f=new Feeder();f.feed(dog);}
}

 

需求2:此时动物园引进新品种 猫,此时需要创建一个猫类。并添加eat方法,让人类也能喂养猫。

需求3:此时动物园又引进了一种新动物,叫做pig猪 此时pig也有eat 并且 人类也需要喂养pig,请完成功能。

每次动物园引进新产品,都需要在饲养员类中增加一个方法,如果动物园有10000个动物,那么饲养员类中需要增加10000喂养的方法。

使用多态来解决上面代码耦合性。

 27.1.2什么是多态

多态:在继承实现情况下的一种现象,

表现为:对象多态、行为多态

 

 27.1.3对象多态

多态性:

允许你将父对象设置成为一个或更多的他的子对象相等的技术,

赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.

简单一句话:允许将子类类型赋值给父类类型

多态:

父类对象表现多种子类的形态的能⼒的特征,

⼀句话多态就是⽗类引用子类对象。

向同⼀个⽗类的不同⼦类发送同⼀条消息,⾏为不同。

 27.1.4多态的使用前提

必须有继承|实现关系

 Animal

package demo02;/*** @program: day1106* @description:* @author: 闫克起2* @create: 2023-11-06 15:34**/
public class Animal {private String name;public void eat(){}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

 Dog

public class Dog extends Animal {@Overridepublic void eat() {System.out.println(getName()+"吃奥里给");}
}

Cat  

public class Cat extends Animal {@Overridepublic void eat() {System.out.println(getName()+"吃鱼");}
}

 Feeder

public class Feeder {//public void feed(Animal animal){//Animal animal=new Dog();animal.eat();}}

 Test

package demo02;/*** @program: day1106* @description:* @author: 闫克起2* @create: 2023-11-06 15:14**/
public class Test01 {public static void main(String[] args) {Dog dog=new Dog();dog.setName("Jerry");Cat c=new Cat();c.setName("Tom");Feeder f=new Feeder();f.feed(dog);f.feed(c);}
}

如果在增加新的品种动物,无需修改Feeder饲养员类中的代码了。 解决耦合性。

 

  1. 包含小狗 小猫 小猪 有一个共同的方法会摆造型

打印机 能够打印动物的造型

良好的可扩展性和可维护性

27.2 向上转型

向上转型:⽗类引⽤⼦类对象(⾃动成⽴,缺点是失去调⽤⼦类独有⽅法的能⼒

父类 对象名=new 子类();

 Dog中的代码:

package com.ykq.duotai;
public class Dog extends Animal {// eat@Overridepublic void eat(){System.out.println("我是一只狗,我喜欢吃奥里给!!!");}// 看家 watchDoor()public  void watchDoor(){System.out.println("狗会看门!!!");}
}

 test类:

Animal animal = new Dog();// 向上转型// dog 赋值给Animal
animal.eat();
animal.watchDoor(); // 报错

 

向上转型后该对象只能当成父类对象来用,

原来子类中定义的属性和方法就被屏蔽掉不能被调用了。

比如

狗里有一个【看门】的方法,

如果向上转型后作为【动物】类就不能调用dog类独有的【看门】的方法。

 总结: 向上转型 从小的转向大的 缺点:不能调用子类里面的特有的方法 .

  1. 能调用哪些方法看等号的左边。

  2. 执行哪个方法看等号的右边。

27.3向下转型

向下转型:⼦类引⽤⽗类对象(强制转换,慎重)

public static void main(String[] args) {// DogAnimal dog = new Dog();// ⼦类引⽤⽗类对象Dog dog1 = (Dog) dog;// 向下转型 可以调用子类里面方法   属性dog1.watchDoor();Cat cat = (Cat) dog;}

 

此时可以调用子类对象中的方法和属性。

注意事项:ClassCastException

 

 (面试题)

 

以上为继承多态 占据5% 继承多态

继承多态,接口多态95%。

向下转型: 大的转化为小的

缺点:强制类型转换 ClassCastException类型转换异常

优点: 调用子类里面的独有的方法

 27.4抽象类和抽象方法

 抽象类表示现实中并不存在该类,只是为了代码的可用性而抽取的一个父类。

 

 

使用abstract修饰类和方法。语法:public abstract class 类名{​      public abstract 返回类型 方法名(参数列表);}

抽象类

/**1.抽象类使用abstract修饰. 该类中可以有抽象方法和普通方法.2.抽象类不能实例化对象.3.子类继承了抽象类,那么该子类需要重写抽象类中的所有抽象方法.**/
public abstract class Shape {//求面积public  void area(){};//求周长public abstract void perimeter();public void show(){System.out.println("普通方法");}
}

长方形子类

public class Rect extends Shape {@Overridepublic void area() {System.out.println("长乘宽");}@Overridepublic void perimeter() {System.out.println("长加宽乘2");}
}

 测试类:

public class Test {public static void main(String[] args) {Shape s=new Circle();//向上转型s.area();s.perimeter();s.show();}
}

特点(面试题):

1)抽象类不能new对象

   2)抽象类可以有构造方法,专门让子类调用的。(super(color, name))。

   3)抽象类中可以含有抽象方法,也可以没有抽象方法。

   4)抽象类中可以含有普通实例方法。  sleep()

   5)抽象方法必须使用abstract修饰,并且不能有方法体(不能有{})。

   6)子类继承抽象类时必须重写所有的抽象方法(参考demo2中的Cat),如果不重写自己必须是抽象类(参考demo2中的Dog)。

   7)含有抽象方法的类一定是抽象类。(把抽象类上的abstract去掉,看是否报错)

 

  1. 多态: 一个类对象具有多种形态。

  2. 对象的多态: 父类 对象名=new 子类对象(); 向上转型

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

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

相关文章

亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(一) ​

随着大语言模型效果明显提升,其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型(LLM)知识召回(Knowledge Retrieval)的方式,在私域知识问答方面可以很好的弥补通…

5种主流API网关技术选型,yyds!

API网关是微服务项目的重要组成部分,今天来聊聊API网关的技术选型,有理论,有实战。 不 BB,上文章目录: 1 API网关基础 1.1 什么是API网关 API网关是一个服务器,是系统的唯一入口。 从面向对象设计的角度…

Echarts 大屏注册自定义地图解析文件流报错以及坐标显示数值和地图填充以及dataV轮播数据不显示问题解决

效果图: 1、第一种方式 后台接口获取到SVG图片的文件流,postman能够正确解析出文件流,前端调用api时需要设置返回的响应格式为image/svg+xml格式,否则解析失败 拿到文件流后是这样的 <?xml version="1.0" encoding="utf-8"?> <!-- Generato…

连接备份1128

深度学习—分类识别篇&#xff1a;http://tr.daheng-imaging.com/watch/1050636http://tr.daheng-imaging.com/watch/1050636 深度学习—目标检测篇&#xff1a;http://tr.daheng-imaging.com/watch/1101141http://tr.daheng-imaging.com/watch/1101141 深度学习—缺陷分割篇&a…

STM32通讯设计

STM32通讯设计 通讯流程STM32程序 通讯流程 1.使用HT2202芯片配置为主机接收&#xff08;轮询模式&#xff09;。 2.将STM32芯片配置为从机发送&#xff0c;中断模式下发送固定数据。 3.如果HT2202芯片能够收到STM32发送的数据则通讯成功&#xff0c;否则通讯失败。 STM32程序…

mac 聚焦搜索不显示

我是连搜索框都不显示&#xff0c;不是搜索结果显示异常 点右上角的搜索按钮都毫无反应 我检查过快捷键之类的设置&#xff0c;都正常&#xff0c;最后是通过删除文件解决的 cd ~/Library/Preferences/ rm com.apple.Spotlight.plist 重启 mac 参考 Spotlight Search Not W…

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录 刷题前唠嗑题目&#xff1a;确定两个字符串是否接近题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 刷完今天&#xff0c;我的每日一题就坚持一个月啦&#xff0c;月度勋章要到手啦 今早很尴尬&#xff0c;…

9.Docker的虚悬镜像-Dangling Image

1.虚悬镜像的概念 虚悬镜像 (Dangling Image) 指的是仓库名 (镜像名) 和标签 TAG 都是 的镜像。 2.构建本地虚悬镜像 这里我以unbuntu为例来说明。 2.1 编写Dockerfile文件 FROM ubuntu:22.042.2 根据Dockerfile文件构建虚悬镜像 docker build .上面这段命令&#xff0c…

解决Ruoyi-vue项目中接口请求超时的设置

背景&#xff1a; 有个几十亿的数据量的查询&#xff0c;查询时间超过40s&#xff0c;而Ruoyi-vue默认超过10s就拦截&#xff0c;因此需要修改默认超时时间 解决办法&#xff1a; 只需要打开request.js&#xff0c;把timeout设置扩大即可&#xff0c;默认是10000毫秒&#xff0…

TDI网络过滤驱动应用(一)

文章目录 TDI网络过滤驱动应用1. 技术概览2. 数据包的抓取3. 应用实例3.1 TrafficShaper(限流)3.2 DnsRedirector(DNS重定向)3.3 TcpRedirector(TCP重定向) 4. 总结与参考 TDI网络过滤驱动应用 在前面的文章中&#xff0c;我们分析了TDI网络过滤驱动的基本开发框架以及TDI网络…

unity学习笔记12

一、物理系统 如何让一个球体受到重力的影响&#xff1f; 只要给物体添加刚体组件&#xff08;Rigidbody&#xff09;&#xff0c;就可以使其受到重力影响 1.刚体&#xff08;Rigidbody&#xff09;&#xff1a; 刚体是一个组件&#xff0c;用于使游戏对象受到物理引擎的控制。…

【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

文章目录 ⭐⭐⭐Spring核心源码分析自定义Spring框架⭐⭐⭐一、Spring使用回顾二、Spring核心功能结构1、Spring核心功能2、bean概述 三、Spring IOC相关接口分析1、BeanFactory解析2、BeanDefinition解析3、BeanDefinitionReader解析4、BeanDefinitionRegistry解析5、创建容器…

Unity引擎:创造无限可能的游戏开发平台

Unity引擎&#xff1a;创造无限可能的游戏开发平台 一、Unity引擎概述1.1 什么是Unity引擎&#xff1f;1.2 Unity引擎的特点和优势 二、Unity开发环境和工具2.1 Unity编辑器2.2 支持的平台2.3 脚本语言2.4 图形和音频工具 三、Unity游戏开发流程四、示例应用场景五、结论&#…

three.js--立方体

作者&#xff1a;baekpcyyy&#x1f41f; 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…

对接电商平台高效获取各大电商平台数据,商品详情数据代码示例

电商可以通过使用API接口获取商品信息数据。API是应用程序编程接口的缩写&#xff0c;它允许程序之间进行通信和数据传输。为了获取商品信息数据&#xff0c;电商可以利用API接口向商品供应商的数据库发送请求&#xff0c;然后接收并解析返回的数据。 具体来说&#xff0c;电商…

xorm源码学习

文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源码基本结构连接复用&#xff0c;提高性能。增加数据库连接池数量连接管理 database/sql主要内容&#xff1a;sql.DB创建数据库连接sql.Open()DB.conn…

C++设计模式之工厂模式(中)——工厂模式

工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加&#xff0c;可以通过新增子类工厂来生产&#xff0c;没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…

全程云OA SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能&#xff0c;超过100多个子模块。为企业内部提供高效、畅通的信息渠道&#xff0c;同时也能大力推动公司信息系统发展&#xff0c;提高企业的办公自动化程度和综合…

Doris数据模型的选择建议(十三)

Doris 的数据模型主要分为 3 类&#xff1a;Aggregate、Uniq、Duplicate Aggregate: Doris 数据模型-Aggregate 模型 Uniq&#xff1a;Doris 数据模型-Uniq 模型 Duplicate&#xff1a;Doris 数据模型-Duplicate 模型 因为数据模型在建表时就已经确定&#xff0c;且无法修改…