Java.6--多态-设计模式-抽象父类-抽象方法

一、多态

1.定义--什么是多态?

a.同一个父类的不同子类对象,在做同一行为的时候,有不同的表现形式,这就是多态。
(总结为:一个父类下的不同子类,同一行为,不同表现形式。)
b."动态绑定":开发阶段,以父类做参数,以父类做返回值类型 (代码的通用性比较好);
                       程序运行时,会根据实际传入参数的类型,动态的调用该类型所对应的方法(扩展性好)。
c.多态的好处:提高代码的扩展性和可维护性。

1c2a0558f15446b8a481461e38040476.png【以父类做返回值】

【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.补充:
基本数据类型和引用数据类型的区别:基本类型传值,引用类型传地址

 

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

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

相关文章

【力扣】GO解决子序列相关问题

文章目录 一、引言二、动态规划方法论深度提炼子序列问题的通用解法模式 三、通用方法论应用示例&#xff1a;最长递增子序列&#xff08;LeetCode题目300&#xff09;Go 语言代码实现 四、最长连续递增序列&#xff08;LeetCode题目674&#xff09;Go 语言代码实现 五、最长重…

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件

目前最新 Reflector V11.1.0.2067版本 .NET 反编译软件 一、简介二、.NET Reflector的主要功能包括&#xff1a;1. **反编译**: 反编译是将已编译的.NET程序集&#xff08;如.dll或.exe文件&#xff09;转换回可读的源代码。这使得开发者可以查看和学习第三方库的实现细节&…

手机淘宝自动下单退货自动化RPA脚本机器人

使用手机集线器连接多个手机并发运行。 脚本分3个部分&#xff08;读取本地连接下单&#xff0c;退货获取退货地址信息&#xff0c;填写快递单号&#xff09; 脚本部分图结构看下面的图片 部分数据统计展示

基于vue框架的的高校设备信息管理系统的设计与实现tx6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备管理员,设备维护员,设备类别,设备,设备入库,设备分发,设备调拨,定期维护,维护任务,设备运行记录 开题报告内容 基于Vue框架的高校设备信息管理系统的设计与实现开题报告 一、项目背景及意义 随着高校教育事业的蓬勃发展&#xff…

线性代数学习

1.标量由只有一个元素的张量表示 import torchx torch.tensor([3,0]) y torch.tensor([2,0])x y, x * y, x / y, x**y 2.可以将向量视为标量值组成的列表 x torch.arange(4) x 3.通过张量的索引访问任一元素 x[3] 4.访问张量长度 len(x) 5.只有一个轴的张量&#xff0c…

gin入门教程(10):实现jwt认证

使用 github.com/golang-jwt/jwt 实现 JWT&#xff08;JSON Web Token&#xff09;可以有效地进行用户身份验证,这个功能往往在接口前后端分离的应用中经常用到。以下是一个基本的示例&#xff0c;演示如何在 Gin 框架中实现 JWT 认证。 目录结构 /hello-gin │ ├── cmd/ …

Could not retrieve mirrorlist http://mirrorlist.centos.org错误解决方法

文章目录 背景解决方法 背景 今天在一台新服务器上安装nginx&#xff0c;在这个过程中需要安装相关依赖&#xff0c;在使用yum install命令时&#xff0c;发生了以下报错内容&#xff1a; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx8…

【永中软件-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

第二十九篇:TCP的报文格式,TCP系列三

TCP是协议&#xff0c;是协议就有协议格式。 1.源端口和目的端口 TCP源端口&#xff08;Source Port&#xff09;&#xff1a;源计算机上的应用程序的端口号&#xff0c;占 16 位。 TCP目的端口&#xff08;Destination Port&#xff09;&#xff1a;目标计算机的应用程序端口…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…

基于Python+SQL Server2008实现(GUI)快递管理系统

快递业务管理系统的设计与实现 摘要: 着网络新零售的到来&#xff0c;传统物流在网购的洗礼下迅速蜕变&#xff0c;在这场以互联网为基础的时代变革中&#xff0c;哪家企业能率先转变其工作模式就能最先分得一杯羹&#xff0c;物流管理也不例外。传统的物流管理模式效率低下&a…

同城分类信息网站源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 该系统采用PHP作为后端开发语言&#xff0c;MySQL作为数据库管理系统。PHP是一种广泛使用的开源脚本语言&#xff0c;特别适合于Web开发&#xff0c;具有跨平台、易于学习、性能稳定等优点。MySQL则是一款轻量级的关系型数据库管理系统&#xff0c;具有体积小、速度快…

DHorse v1.6.0 发布,基于 k8s 的发布平台

版本说明 新增特性 支持Codeup&#xff08;阿里云云效&#xff09;代码仓库&#xff1b;支持环境的自动部署&#xff1b; 优化特性 管理员角色部署环境部需要审批&#xff1b;优化页面展示&#xff1b; 升级指南 升级指南 DHorse介绍 DHorse是一个轻量级、简单易用的云…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关&#xff0c;包含对请求的路由和过滤两个主要功能。 1&#xff09;路由功能&#xff1a;负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础。 2&#xff09;过滤功能&#xff1a;负责对请求的过程…

crc, md5 和 sha的区别

效率不同: 直接看代码 import zlib import hashlib import timewith open(rD:\data., rb) as f:x f.read()s time.time() for i in range(100000):d zlib.crc32(x) print(time.time() - s)s time.time() for i in range(100000):m hashlib.md5()m.update(x)d m.hexdige…

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…

idea项目搭建的四种方式: 一(以idea2017为例)

目录 1. 普通java项目 2. 普通JavaWEB项目 3. maven的JavaWEB项目 4. maven的java项目 1. 普通java项目 ①点击“Create New Project”&#xff1b; ②选择“Java”&#xff0c;选择自己安装的jdk&#xff0c;点击“Next”&#xff1b; ③填好项目名称和路径&#xff1b;…

记录一个docker volume映射目录创建文件报错问题

最近用docker-compse做中间件部署。 发现使用volume映射目录后&#xff0c;初始化时创建文件报错导致容器启动失败问题。 提示是没有访问权限。 如下&#xff1a; mariadb 10:07:26.86 INFO > mariadb 10:07:26.86 INFO > Welcome to the Bitnami mariadb contain…

CORS预检请求配置流程图 srpingboot和uniapp

首先要会判断预检请求 还是简单请求 简单请求 预检请求 #mermaid-svg-1R9nYRa7P9Pll4AK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1R9nYRa7P9Pll4AK .error-icon{fill:#552222;}#mermaid-svg-1R9nYRa7P9Pll4…

基于ssm+vue的购物商场的设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…