Java.6--多态-设计模式-抽象父类-抽象方法
一、多态
1.定义--什么是多态?
a.同一个父类的不同子类对象,在做同一行为的时候,有不同的表现形式,这就是多态。
(总结为:一个父类下的不同子类,同一行为,不同表现形式。)
b."动态绑定":开发阶段,以父类做参数,以父类做返回值类型 (代码的通用性比较好);
程序运行时,会根据实际传入参数的类型,动态的调用该类型所对应的方法(扩展性好)。
c.多态的好处:提高代码的扩展性和可维护性。
【以父类做返回值】
【pizza父类】
package work.demo1;public class Pizza {//父类--子类有培根披萨,海鲜披萨//父类 1.声明共有属性 2.空参构造 有参构造 3.get set 方法 取值赋值 4.方法String name;int price;int size;public Pizza() {}public Pizza(String name, int price, int size) {this.name = name;this.price = price;this.size = size;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public void show() {//这个方法展示,所以子类共有的System.out.println("名称"+name);System.out.println("价格"+price);System.out.println("尺寸"+size);}
}
【Peigen子类】
package work.demo1;import java.util.Scanner;public class Peigen extends Pizza {//子类培根披萨private int g;//培根披萨私有属性--克数public Peigen() {//空参构造}public Peigen(String name, int price, int size, int g) {//有参构造super(name, price, size);this.g = g;}//get setpublic int getG() {return g;}public void setG(int g) {this.g = g;}public void show() {super.show();//引用父类方法System.out.println("请输入培根克数:"+g);}}
【Haixian子类】
package work.demo1;import java.util.Scanner;public class Haixian extends Pizza {//子类海鲜披萨private String food;//配料public Haixian(String food) {this.food = food;}public Haixian(String name, int price, int size, String food) {super(name, price, size);this.food = food;}public String getFood() {return food;}public void setFood(String food) {this.food = food;}public void show() {super.show();System.out.println("输入配菜:"+food);}}
【dopizza工厂类】
package work.demo1;import java.util.Scanner;public class Dopizza {public Pizza dopizza() {//方法签名 Pizza:返回类型,表示该方法返回一个 Pizza 对象//父类做返回值的含义//在 Java 中,父类作为返回类型是一种常见的设计模式,称为多态。// 具体来说,当一个方法的返回类型是父类时,该方法可以返回任何继承自该父类的子类对象。// 这种方式提供了更大的灵活性和扩展性。//在代码中,dopizza 方法的返回类型是 Pizza,这是一个父类。// 方法内部根据用户的输入创建了不同的子类对象(Peigen 和 Haixian),但最终返回的是一个 Pizza 类型的对象。Pizza pizza = null;//对象类型 对象名System.out.println("请选择想要制作的比萨(1.培根比萨2.海鲜比萨):");Scanner sc = new Scanner(System.in);int i = sc.nextInt();if(i==1){System.out.println("请输入培根克数:");int weight= sc.nextInt();System.out.println("请输入比萨大小:");int size = sc.nextInt();System.out.println("请输入比萨价格:");int price= sc.nextInt();pizza=new Peigen("培根披萨",price,size,weight);} else if (i==2) {System.out.println("请输入配料信息:");String food = sc.next();System.out.println("请输入比萨大小:");int size = sc.nextInt();System.out.println("请输入比萨价格:");int price= sc.nextInt();pizza=new Haixian("海鲜披萨",price, size,food);}return pizza;}
}
【Test测试类】
package work.demo1;import java.util.Scanner;public class Test {public static void main(String[] args) {Dopizza dopizza =new Dopizza();Pizza peigen = dopizza.dopizza();peigen.show();
// 这段代码的功能是创建一个 Dopizza 对象,并调用其 dopizza 方法生成一个 Pizza 对象,然后调用 Pizza 对象的 show 方法显示披萨的信息。
// 创建 Dopizza 对象 dopizza。
// 调用 dopizza 对象的 dopizza 方法,返回一个 Pizza 对象 peigen。
// 调用 peigen 对象的 show 方法,显示披萨的信息。}
}
【以父类做参数】
package work.demo1;import java.util.InputMismatchException;
import java.util.Scanner;public class Dopizza {public Pizza dopizza() {Pizza pizza = null;Scanner sc = new Scanner(System.in);System.out.println("请选择想要制作的比萨(1.培根比萨2.海鲜比萨):");int choice = readInt(sc, 1, 2);if (choice == 1) {System.out.println("请输入培根克数:");int weight = readInt(sc, 0, Integer.MAX_VALUE);System.out.println("请输入比萨大小:");int size = readInt(sc, 0, Integer.MAX_VALUE);System.out.println("请输入比萨价格:");int price = readInt(sc, 0, Integer.MAX_VALUE);pizza = new Peigen("培根披萨", price, size, weight);} else if (choice == 2) {System.out.println("请输入配料信息:");String food = sc.next();System.out.println("请输入比萨大小:");int size = readInt(sc, 0, Integer.MAX_VALUE);System.out.println("请输入比萨价格:");int price = readInt(sc, 0, Integer.MAX_VALUE);pizza = new Haixian("海鲜披萨", price, size, food);}return pizza;}// 父类 Pizza 作为参数传递的地方public void processPizza(Pizza pizza) {if (pizza instanceof Peigen) {Peigen peigen = (Peigen) pizza;System.out.println("培根披萨信息:");peigen.show();} else if (pizza instanceof Haixian) {Haixian haixian = (Haixian) pizza;System.out.println("海鲜披萨信息:");haixian.show();} else {System.out.println("未知类型的披萨");}}//异常处理 private int readInt(Scanner sc, int min, int max) {while (true) {try {int value = sc.nextInt();if (value >= min && value <= max) {return value;} else {System.out.println("输入值不在有效范围内,请重新输入:");}} catch (InputMismatchException e) {System.out.println("输入无效,请输入一个整数:");sc.next(); // 清除错误输入}}}
}
【Test测试类】
package work.demo1;public class Test {public static void main(String[] args) {Dopizza dopizza = new Dopizza();Pizza pizza = dopizza.dopizza();dopizza.processPizza(pizza);}
}
PS:父类做参数子类父类都一样,只有工厂类和测试类有修改,异常处理在下一篇笔记
这部分会修改,因为工厂设计模式就是父类做返回值。
2.使用多态的场景
程序中一定有两条业务线:
一条是继承线由父子类组成的;一条是关联线,两条线有业务关联,第二天业务线中,父类做参数了;父类做返回值类型了。
例如:动物园,饲养员喂养动物,猫狗猴子
3.表现形式与实现条件
(1)表现形式
a.父类做参数:扩展性做的很好。
b.父类做返回值类型(工厂设计模式):扩展性还不够好,反射的扩展性最好!
(2)实现条件:继承;重写;声明父类、new子类( Person stu =new Student();)。
父类 定义对象= new 子类();
4.多态中的类型转换
(1)向上类型转换(声明父类new子类):
将对象由子类类型 转成 父类类型(缩小范围了:为了程序代码的通用)。
只能调用继承父类的,或者重写父亲的资源;不能调用自己特有的。
(2)向下类型转换(子类类型,声明父类new子类):
可以调用子类特有的方法;为了防止类型转换错误,使用关键字instanceof
if(animal instanceof Cat){
((Cat) animal).play(); //向下类型转换:可以调用子类特有的资源了
}
5.声明父类new 子类
首先实现多态的条件:继承,重写,声明父类new 子类
声明父类new 子类是拼凑出来的
【👇声明父类】
public void feet(Animal animal){
animal.eat();
if(animal instanceof Cat){
((Cat) animal).play(); //向下类型转换:可以调用子类特有的资源了
}
}
【主方法里👇new 子类】
Cat cat=new Cat();
feeder.feet(cat);
二、设计模式
1.定义--什么时设计模式?
a.为了解决一类问题的,一种固定的功能代码。
b.一共有23种设计模式:
单例模式:构造方法私有化
工厂模式:父类做返回值类型
代理模式:多个实现类,实现同一个接口
2.简单工厂模式的基本要求
a.定义一个static方法,通过类名直接调用。
b.返回值类型是父类类型,返回的可以是其任意子类类型。
c.传入一个字符串类型的参数,工厂根据参数创建对应的子类产品。
三、抽象父类
1.抽象类的作用--为什么要学习抽象类?
因为父类没有创建对象的必要!所以就不让父类创建对象了,然后就父类为抽象的,抽象类就不能new 对象。
public abstract class Pizza { }
2.抽象类不能创建对象了,它还有必要拥有构造方法吗?--为了让子类调用!
四、抽象方法
1.定义--为什么要学习抽象方法?
为了告诉子类,必须重写该方法!
public abstract void show( );
总结 :A.一个类如果拥有抽象方法,那么这个类一定是抽象类;
但是一个类是抽象类,可以没有抽象方法。
B.以后再写父类,都要写成抽象的;
父类里,尽可能多的创建抽象方法。
五、fianl关键字:final 最终的,可以修饰属性.方法.类
1.final 类:不可以被继承。
2.final 方法:不可以被重写。
3.final 属性:基本类型:值不可以被改变。
引用类型:地址不可以被改变,对象属性可以变。
4.补充:
基本数据类型和引用数据类型的区别:基本类型传值,引用类型传地址
相关文章:
Java.6--多态-设计模式-抽象父类-抽象方法
一、多态 1.定义--什么是多态? a.同一个父类的不同子类对象,在做同一行为的时候,有不同的表现形式,这就是多态。(总结为:一个父类下的不同子类,同一行为,不同表现形式。࿰…...
JAVA Maven 的安装与配置
一、下载地址 官方网站:Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk,请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…...
【程序分享】PCB元件坐标对齐工具 V1.3
↑↑↑点击上方蓝字,关注我们! “PCB元件坐标对齐工具 V1.3”脚本程序在PCB文档中将元件的坐标自动移动到参考圆弧的中心,参考圆弧支持机械层1层和禁止布线层,参考图元的位置任意,不局限于栅格位置。 程序会自动…...
[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist
[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…...
处理Hutool的Http工具上传大文件报OOM
程序环境 JDK版本: 1.8Hutool版本: 5.8.25 问题描述 客服端文件上传主要代码: HttpRequest httpRequest HttpUtil.createPost(FILE_UPLOAD_URL); Resource urlResource new UrlResource(url, fileName); httpRequest.form("file&q…...
transforms的使用
示例代码 from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms#打开该图片 img_path"hymenoptera_data/val/bees/10870992_eebeeb3a12.jpg" imgImage.open(img_path) writerSummaryWriter("logs&quo…...
python-PyQt项目实战案例:制作一个视频播放器
文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章,也知道pyqt通过使用label控件显示图像的…...
反向传播的微积分原理 | Chapter 4 | Deep Learning | 3Blue1Brown
目录 前言1. 简介2. 神经网络中的链式法则3. 微积分的计算4. 公式含义5. 代价函数对权重偏置的敏感度6. 多个神经元的情形7. 回顾相关资料结语 前言 3Blue1Brown 视频笔记,仅供自己参考 这个章节主要来深度讲解反向传播中的一些微积分理论 官网:https://…...
matlab读取excel表格
使用matlab读取excel表格中的数据 使用推荐代码读取excel表格中的数据 path "C:\Users\24975\Desktop\503\GUI展示案例\Tx_20_0_Rx_40_90_0.1_95_L.xlsx";%文件路径 data readtable(path,Sheet,Sheet1,ReadRowNames,false,ReadVariableNames,false,Ra…...
基于springboot+vue实现的助学兼职系统(源码+L文+ppt)4-092
基于springbootvue实现的助学兼职系统(源码L文ppt)4-092 第4章 系统设计 4.1 总体功能设计 一般学生、招聘公司和管理者都需要登录才能进入助学兼职系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使…...
⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)
💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...
CMU生成式人工智能大模型:从入门到放弃(九)
引言 在前面的系列博客中,我们深入探讨了生成式对抗网络(GANs)和变分自编码器(VAEs)等生成式模型。今天,我们将探索扩散模型(Diffusion Models)的进一步应用,并讨论在上…...
HTML基础总结
一、简介 HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页的标准标记语言。它通过使用各种标签来定义网页的结构和内容,告诉浏览器如何显示网页。HTML 文档由标签和文本组成,标签用于描述文本的性质…...
EXCELL中如何两条线画入一张图中,标记坐标轴标题?
1,打开excel,左击选中两列, 2,菜单栏>“插入”>”二维折线图”选中一个 3,选中出现的两条线中的一条右击>最下一行,“设置数据系列格式” 4,右测“系列选项中”>点击“次坐标轴” 5…...
Zabbix企业级分布式监控环境部署
“运筹帷幄之中,决胜千里之外”。在IT运维中,监控占据着重要的地位,按比例来算,说占30%一点也不为过。对IT运维工程师来说,构建一个真正可用的监控告警系统是一项艰巨的任务。在监控系统的开源软件中,可供选…...
水轮发电机油压自动化控制系统解决方案介绍
在现代水电工程中,水轮机组油压自动化控制系统,不仅直接关系到水轮发电机组的安全稳定运行,还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统,适用于水轮发电机组调速器油压及主阀(蝶…...
今天不分享技术,分享秋天的故事
引言 这个爱情故事好像是个悲剧,你说的是婚姻。爱情没有悲剧,对爱者而言,爱情怎么会是悲剧呢。对春天而言,秋天是它的悲剧吗。结尾是什么,等待,之后呢,没有之后。或者说,等待的结果…...
转录组上游分析流程(三)
环境部署——数据下载——查看数据(非质控)——数据质控——数据过滤(过滤低质量数据) 测序得到的原始序列含有接头序列和低质量序列,为了保证信息分析的准确性,需要对原始数据进行质量控制,得到高质量序列(Clean Reads),原始序列…...
excel判断某一列(A列)中的数据是否在另一列(B列)中
如B列如果有7个元素,在A列右边的空白列中,输入如下公式: COUNTIF($B$1:$B$7,A1), 其中,$B$1:$B$7代表A列中的所有数据即绝对范围,A1代表B列中的一个单元格....
[环境配置]macOS上怎么查看vscode的commit id
macOS的commit id和windows上有点不一样,windows可以在帮助-关于查看 macOS则需要再左边第一个查看...
.net framework 3.5sp1组件安装进度条不动启动错误怎么解决
安装.NET Framework 3.5 SP1通常需要管理员权限。这是因为安装过程可能需要修改系统文件和注册表项,这些操作通常需要管理员权限才能执行。在Windows系统上,安装.NET Framework 3.5 SP1通常通过控制面板中的“启用或关闭Windows功能”选项进行࿰…...
学习threejs,利用THREE.ExtrudeGeometry拉伸几何体实现svg的拉伸
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ExtrudeGeometry拉伸…...
大模型之三十二-语音合成TTS(coqui) 之二 fine-tune
在 大模型之三十-语音合成TTS(coqui)[shichaog CSDN]中提到了xttsv2的fine-tune。 数据情况: 我是从bilibili up主小Lin说提取了一些视频,然后进行了重新的fine-tune。 训练结果 如下图所示,上面波形幅度较大的是xttsv2原始模型的结果&am…...
JVM的内存模型是什么,每个区域的作用是什么,以及面试题(含答案)
JVM(Java 虚拟机)内存模型定义了 Java 程序在运行时如何分配、管理和优化内存。JVM 内存模型主要分为几个关键区域,每个区域有特定的作用: JVM 内存模型 堆内存(Heap): 作用:用于存…...
《设计模式三》Java代理模式实现
Java代理模式实现 静态代理实现 // Subject.java // 主题接口,定义了请求方法 public interface Subject {void request(); }// RealSubject.java // 真实主题实现类,实现了Subject接口 public class RealSubject implements Subject {Overridepublic …...
vue3中计算属性的用法以及使用场景
在 Vue 3 中,计算属性(computed properties)是一种基于依赖项动态计算并缓存的响应式数据。它与 Vue 2 中的计算属性类似,但在组合式 API 中使用 computed 函数来定义。计算属性的核心优势在于能够自动缓存计算结果,仅…...
pytorh学习笔记——cifar10(六)MobileNet V1网络结构
基础知识储备: 一、深度可分离卷积(Depthwise Separable Convolution) MobileNet的核心是深度可分离卷积(Depthwise Separable Convolution),深度可分离卷积是卷积神经网络(CNN…...
报表系统-连接数据库操作
本专栏用于解析自己开源的项目代码,作为复盘和学习使用。欢迎大家一起交流 本样例说明源码开源在: ruoyi-reoprt gitee仓库 ruoyi-report github仓库 欢迎大家到到项目中多给点star支持,对项目有建议或者有想要了解的欢迎一起讨论 连接数据库…...
[计算机网络] 常见端口号
前言 常见的端口号是指互联网协议(如TCP/IP)中预留给特定服务使用的数字范围。它们主要用于标识网络应用程序和服务,并帮助数据包在网络中找到正确的接收方。 按协议类型划分 TCP协议端口: 21:FTP文件传输协议2…...
Linux系统块存储子系统分析记录
1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en,可以获取多个linux内核版本下的存储栈概略图,下面是kernel-4.0的存储栈概略图: 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD:固态存储核心…...
咨询学校网站开发费用/提高百度搜索排名工具
logon password check 加班到现在, 还是得发个 csdn 本文主要通过一个案例介绍两个东西 正则表达式中 必须含有某类字符的时候对应的 正则写法(在我之前的正则文章中已经写过了)重复字符以及连续字符的判断方式 正则来表示验证的字符串中…...
软件网站关键词优化/营销网站建站公司
def task(): current_time datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) print(current_time) coordinate_list Getlnglat().spyder_list_all() pool ThreadPool(10) # 创建线程池并发执行 #第一个参数是函数,第二个参数是一个迭代器&a…...
和萝莉做的电影网站/seo计费怎么刷关键词的
python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 就运行不了;使用python3编写的程序,如果使用python2一样也是不用运行。 Q: 所以,如何在pyCharm 软件中,为你的项目设…...
搭建一个网站教程/广点通广告平台
1.在教育研究文献中,各类文物、教育史专著、名师教育实录等属于()。 A.事实性文献 B.工具性文献 C.理论性文献 D.经验性文献 2.李老师为研究近年来我国小学教育的发展状况,需要收集有关数据,最可靠的信息来源是&…...
网上商城网站 找什么做/百度广告代理公司
两个月前的一件事,让我突然明白「孤立无援」的含义。(真实经历,经当事人授权,侵权必究)一个朋友的发小,温婉独立,农村走出来的高校美女硕士。有着体面的工作和生活,半年前刚刚步入婚…...
彩票网站做维护是什么/杭州网站优化服务
一、简单回顾 通过前几讲的讲解,我们对工业4.0的认识趋于清晰。 第一讲告诉我们,德国实施工业4.0战略的根本目的是“确保德国制造业的未来”,联想到中国制造2025的“实现制造业由大变强的历史跨越”的战略目标,实质也是“确保中国…...