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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode day1 910+16

910 最小差值 给你一个整数数组 nums&#xff0c;和一个整数 k 。 在一个操作中&#xff0c;您可以选择 0 < i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] x &#xff0c;其中 x 是一个范围为 [-k, k] 的任意整数。对于每个索引 i &#xff0c;最多 只能 …

Excel中如何进行傅里叶变换(FT),几步完成

在 Excel 中&#xff0c;虽然没有像 MATLAB 那样专门的函数库来直接进行傅里叶变换&#xff0c;但可以使用 Excel 内置的分析工具库提供的傅里叶变换&#xff08;FT &#xff0c;Fourier Transform&#xff09;功能。这个工具可以对数据进行频域分析。以下是如何在 Excel 中进行…

开源表单生成器OpnForm

什么是 OpnForm &#xff1f; OpnForm 是一个开源的表单构建工具&#xff0c;旨在简化创建自定义表单的过程&#xff0c;特别适合无编码知识的用户。它通过人工智能优化表单创建流程&#xff0c;支持多种用途&#xff0c;如联系人表单、调查表等。OpnForm 提供了一个直观的拖放…

semi-Naive Bayesian(半朴素贝叶斯)

semi-Naive Bayesian&#xff08;半朴素贝叶斯&#xff09; 引言 朴素贝叶斯算法是基于特征是相互独立这个假设开展的&#xff08;为了降低贝叶斯公式: P ( c ∣ x ) P ( c ) P ( x ∣ c ) P ( x ) P(c|x) \frac {P(c)P(x|c)}{P(x)} P(c∣x)P(x)P(c)P(x∣c)​中后验概率 P …

【Linux】进程优先级进程切换

文章目录 进程优先级查看进程优先级进程优先级的修改 进程切换进程切换的概念 总结 进程优先级 进程优先级是操作系统中用于决定进程调度顺序的重要属性。它表示一个进程在系统资源分配和 CPU 调度中的相对重要性。优先级越高的进程通常会获得更多的 CPU 时间和资源&#xff0…

若依项目学习---【数据字典】

数据字典 若以内置的数据字典&#xff0c;用于维护系统中常见的静态数据。例如&#xff1a;性别、状态……如下&#xff1a; 简单描述&#xff1a;一个地方定义&#xff0c;多个地方使用。 只需要修改数据字典&#xff0c;而不需要修改每一个使用该数据的地方。 常见静态数据&…

【C++】创建TCP客户端

目录 一、实现发送字符串功能 二、实现接收字符串功能 三、客户端接收乱码问题 四、客户端发送乱码问题 五、客户端接收到数据时进行回调 六、子线程接收数据 七、发送Json格式数据 源码 一、实现发送字符串功能 头文件 #pragma once #include <iostream> #inc…

.net framework 3.5sp1插件怎么安装

以下是在不同操作系统电脑上安装.NET Framework 3.5 SP1 的几种常见方法&#xff1a; 一、Windows 10 及以上操作系统&#xff1a; 1.在线安装&#xff08;需要网络连接稳定&#xff09;&#xff1a; 按键盘上的 Windows 键&#xff0c;键入 “Windows 功能”&#xff0c;然…

15分钟学Go 第3天:编写第一个Go程序

第3天&#xff1a;编写第一个Go程序 1. 引言 在学习Go语言的过程中&#xff0c;第一个程序通常是“Hello, World!”。这个经典的程序不仅教会你如何编写代码&#xff0c;还引导你理解Go语言的基本语法和结构。本节将详细介绍如何编写、运行并理解第一个Go程序&#xff0c;通过…

建库建表练习

目录 根据以下需求完成图书管理系统数据库及表设计&#xff0c;并建库建表&#xff0c;并截图创建表的详细信息(desc 表名),不用添加数据 1. 用户表: 字段: 姓名&#xff0c;用户名&#xff0c;密码&#xff0c;电话&#xff0c;住址&#xff0c;专业及年级 2. 图书表: 字段: 图…

你知道吗?这个岗位只招2人,但HR那边却收到了1w份简历

引言 在当前经济环境下&#xff0c;求职者面临的挑战越来越大。互联网行业尤其如此&#xff0c;许多人挤破头都想进入大厂&#xff0c;但竞争异常激烈。如今的就业市场确实变得异常艰难。然而&#xff0c;随着AI大模型技术的兴起&#xff0c;对于那些掌握了相关技能的专业人才…

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速&#xff0c;地铁站作为城市交通系统的重要组成部分&am…

PC端视频编辑解决方案,跨平台SDK,构建多端统一的创作生态

从短视频的兴起&#xff0c;到中长视频内容的蓬勃发展&#xff0c;视频创作领域正经历着一场深刻的变革。在这场变革中&#xff0c;美摄科技以其卓越的PC端视频编辑解决方案&#xff0c;不仅站在了技术创新的前沿&#xff0c;更以开放的姿态&#xff0c;为企业用户搭建起通往未…

Java项目-基于springboot框架的校园疫情防控系统系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Springboot 使用POI导出Excel文件

Springboot 使用POI导出Excel文件 Excel导出系列目录&#xff1a;引入依赖逻辑处理controllerservice数据查询Excel文件内容处理样式封装 导出效果思考 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 【Spri…

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发&#xff08;二&#xff09; 使用vscode进行远程开发很简单&#xff0c;在拓展里搜索 Remote Development&#xff0c;就可以搜索到微软提供的远程开发大礼包&#xff0c;里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL&#xff08;Win…

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的&#xff1a;分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明&#xff1a;由于Gif录制工具帧率不够&#xff0c;渲染60帧用了4.6秒&#xff0c;平均帧率在12Hz左右&#xff0c;所以展示效果不好&#xff0c;想要看好些的效果可以看文章下面…

安科瑞智慧能源管理系统EMS3.0在浙江某能源集团有限公司的应用

安科瑞戴婷 Acrel-Fanny 一、项目背景 浙江某能源集团有限公司位于浙江省宁波前湾新区&#xff0c;主营业务范围包括了储能技术服务&#xff0c;光伏风力发电技术服务&#xff0c;充电桩技术服务&#xff0c;新能源项目的施工以及为企业提供配电房运维服务。 随着新能源的兴…

[ComfyUI]Flux:爆火禅语小和尚素材!禅意人生,享受自在

在快节奏的现代生活中&#xff0c;人们越来越渴望一种宁静和放松的状态。而禅意小和尚素材正是这样一种能够带给我们内心宁静和智慧的存在。ComfyUI的Flux框架结合了禅意小和尚素材&#xff0c;为我们提供了一个探索禅意人生的独特方式。 禅意小和尚素材源于佛教文化&#xff…

DORA 机器人中间件学习教程(5)——3D激光雷达数据可视化

DORA中3D激光雷达数据可视化 1 总体思路2 DORA数据接收节点3 编写yml文件4 启动节点参考资料 截止目前 DORA还没有类似于ROS2中RVIZ这样的可视化工具&#xff0c;而在调试算法时我们又需要将数据进行可视化以验证代码的正确性。目前的解决方法是将DORA中的数据发送到ROS2中&…