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.mzph.cn/news/175836.shtml

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

相关文章

Leetcode—739.每日温度【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—739.每日温度 单调栈实现思想 从右到左实现代码 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();stack<int> st;vector<i…

ensp 启动设备时报40错误,然后一直没有去管,再次进去就好了,我知道是配置虚拟机的时候修改了一些设置:

第一个阶段&#xff1a; 那时我是重置电脑之后就安装了ensp所以没有出现什么问题&#xff0c;&#xff08;那时没有导入ce6800和12800还有防火墙6000&#xff09; 第二个阶段&#xff1a; 因为有华为相关的实验要做&#xff0c;所以心血来潮打开了ensp&#xff08;路由器之前…

Digicert OV 代码签名介绍

Digicert OV 代码签名证书是一种数字证书&#xff0c;用于对软件代码进行数字签名。数字签名是一种验证软件来源和完整性的技术&#xff0c;通过使用私有密钥对代码进行签名&#xff0c;并在签名后使用公共密钥验证签名。 可基于更多平台&#xff0c;最大限度地提高分发量和收…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;2&#xff09; 工程下载&#xff1a;K-means聚类实现步骤与基于K-means聚类的图像压缩 其他&#xff1a; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现…

Linux 命令ln

1什么是链接 ln在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…

SpringBoot监控Redis事件通知

Redis的事件通知 Redis事件通过 Redis 的订阅与发布功能&#xff08;pub/sub&#xff09;来进行分发&#xff0c; 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下&#xff0c; 使用键空间通知功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘&am…

Python爬虫入门课: 如何实现数据抓取 <文字 图片 音频 视频 文档..>

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 解释器 Pycharm 编辑器 模块使用: requests re csv pandas 爬虫实现第一步: 一. 抓包分析 找到对应数据链接地址 套用代码: 修改…

Mybatis 源码搭建

文章目录 源码下载测试模块搭建学习博客 源码下载 首先下载mybatis-parent的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-parent.git 然后下载mybatis的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-src.git 带中文…

无人机遥控器方案定制_MTK平台无人设备手持遥控终端PCB板开发

随着科技的不断发展和无人机技术的逐步成熟&#xff0c;无人机越来越受到人们的关注。作为一种高新技术&#xff0c;无人机的应用范围不断拓展&#xff0c;包括农业、环境监测、城市规划、运输物流等领域。同时&#xff0c;无人机的飞行控制技术也得到了不断的优化和提升。 早…

KVM虚拟机的NAT网络模式原理及过程展示

NAT的方式及原理 NAT方式是KVM安装后的默认方式。 它支持主机与虚拟机的互访&#xff0c;同时也支持虚拟机访问互联网&#xff0c;但不支持外界访问虚拟机。 default是宿主机安装虚拟机支持模块的时候自动安装的。 其中 virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接…

RWA+AI 叙事下的 ProsperEx,对 Web3 时代交易的重新定义

RWA&#xff08;Real World Assets&#xff09;即现实资产代币&#xff0c;其本质在于将现实世界中具有货币价值的东西转化为数字代币&#xff0c;使其可以在区块链上表现价值并进行交易。RWA 资产既可以包括有形资产&#xff0c;例如房产、珠宝、黄金等&#xff0c;也可以包无…

mysql多表重复数据只保留一行的思路

一、问题描述 假设有3个表&#xff0c;test_a&#xff0c;test_b&#xff0c;test_c&#xff1b; test_a和test_b中有些重复数据&#xff1b; 现在要把这2个表的数据同步到表c&#xff0c;但是重复数据只保留1行。 样例如下&#xff1a; 具体要求如下&#xff1a; 1.tes…

Java 简易版王者荣耀

所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…

视频没有字幕怎么办,怎么给视频增加字幕

文章目录 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕前言软件准备制作字幕1. 导入视频2. 将视频拖拽到轨道3. 生成字幕4. 导出字幕 字幕实时翻译1. 播放视频2. 显示字幕设置3. 双语字幕显示 总结 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕 前言 有时候下载的…

血的教训------入侵redis之利用python来破解redis密码

血的教训------入侵redis之利用python来破解redis密码 利用强大的python来进行redis的密码破解&#xff0c;过程不亦乐乎&#xff0c;当然也可以用shell脚本 本篇文章只供学习交流&#xff0c;请勿他用&#xff0c;谢谢。 其他相关联的文章 [1]VMware安装部署kail镜像服务器【…

C#-创建用于测试的父类StartupBase用于服务注入

当写完C#代码&#xff0c;需要对某个方法进行测试。 创建一个XXXTests.cs文件之后&#xff0c;发现需要注入某个服务怎么办&#xff1f; 再创建一个StartupBase.cs文件&#xff1a; public abstract class StartupBase {public IConfiguration Configuration { get; }public …

西南科技大学电路分析基础实验A1(一阶电路的设计)

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 四、实验数据及结果分析(预习写必要实验步骤和表格) 1. 观测一阶电

【香橙派】实战记录2——烧录安卓镜像及基本功能

文章目录 一、安卓烧录二、安卓基本功能1、蓝牙2、相机功能3、投屏 一、安卓烧录 检查环境&#xff1a;检查PC系统&#xff0c;确保有Microsoft Visual C 2008 Redistrbutable - x86&#xff0c;否则在官网下载的官方工具 - 安卓镜像烧录工具里运行vcredist_x86.exe。 插入存储…

鞋厂ERP怎么样?工厂要如何选项契合的ERP

鞋帽这类商品是我们的生活必需品&#xff0c;存在款式多、尺码多、用料复杂、营销渠道多、销售策略和价格策略灵活等情况&#xff0c;伴随电商等行业的发展&#xff0c;鞋帽行业的管理模式也在发生变化。 鞋厂规模的不同&#xff0c;遇到的管理问题各异&#xff0c;而如何解决…

十分钟搭建VScode C/C++运行环境

一、下载配置vscode 1.下载安装VScode 地址&#xff1a;https://code.visualstudio.com/download 下载后&#xff0c;运行安装程序 (VSCodeUserSetup-{version}.exe)。这只需要一分钟。安装程序会将 Visual Studio Code 添加到环境变量中%&#xff0c;可以使用CMD键入“code”…