Java重修第六天—面向对象3

通过学习本篇文章可以掌握如下知识

1、多态;

2、抽象类;

3、接口。

之前已经学过了继承,static等基础知识,这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。

多态

多态是在继承/实现情况下的一种现象,表现为:对象多态行为多态

对象多态

指的是一个人可以有多个身份,例如可以是学生,老师和消防员

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

行为多态

指的是不同身份的人都可以跑,但是跑的行为不同,这里的行为包括速度、姿态等等都可以称之为行为。对应到代码里面就是,run方法的实现逻辑不同注意现实或者文字描述如何对应到代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码验证

// 分类
public class People {

    public void run(){
        System.out.println("人可以跑");
    }
}


class Student extends People{

    @Override
    public void run(){
        System.out.println("学生可以跑的很快");
    }
}

class Teacher extends People{

    @Override
    public void run(){
        System.out.println("老师可以跑有点慢~");
    }
}

结果
在这里插入图片描述

还记得上一篇文章讲的方法的覆盖吗?方法能覆盖的前提是父类对象也有相同的方法。因此p1想要调用run方法的前提是Person类有run方法,否则会报错。

在这里插入图片描述

到此相信你应该对动态有一定的认识了吧。

那么仅仅认识这些还是不够的,下来讲对多态的一个全新的用法。

方法的入参是父类,则可以接收父类和子类对象

代码验证

public class Test {
    public static void main(String[] args) {

        People s1 = new Student();

        People p1 = new People();

        People t1 = new Student();

        //方法的入参是父类,则可以接收父类和子类对象
        go(p1);
        go(s1);
        go(t1);

    }

    public static void go( People p) {
        p.run();
    }
}

结果验证

在这里插入图片描述

final

在java中final是常量的意思,相对比较简单,其功能也比较用以验证。因此就直接将其功能结论记录如下。

总结

在这里插入图片描述

抽象类

在java中存在一个关键词:abstract(抽象) 用来修饰类和成员方法。

被修饰的类叫做抽象类,被修饰方法叫做抽象方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特点:

  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
  • 抽象类不能创建对象,一般来说抽象类往往作为父类
  • 一个类A继承抽象类,必须重写抽象类的全部抽象方法,否则类A也被定义为抽象类。

这些特点可以用代码验证,由于过于简单这里就不再阐述。

抽象类的场景和好处

之前学习到了多态,可以配合抽象类一起使用,

  • 父类知道子类想要做某个行为,但是每个子类的实现情况不一样,因此父类可以定义为抽象类,交给子类重写方法,可以更方便的支持多态。

例如:

在这里插入图片描述

代码实现

在这里插入图片描述

抽象类的应用—模板模式

学习完模板模式,你应该总结出,模板模式解决了什么问题,解决思路是怎么样的。

它为解决方法中存在重复代码的问题

如何实现

1、定义一个抽象类

2、在里面定义两个方法

​ 一个是模板方法:把相同代码放里面去。

​ 一个是抽象方法:具体实现交给子类完成。

场景1:写作文:

第一段是相同的

最后一段也是相同的

只有最后一段是不同的。

场景2:移动支付

支付前的校验

不同的支付方式(支付宝,微信,银行卡,xxx)

支付后的操作。

public abstract class People {

    public void write(){
        System.out.println("\t\t\t《看书》");
        System.out.println("周六作业看书xxxxxx");
        System.out.println(writeMain());
        System.out.println("终于看完了");
    }

    public abstract String writeMain();
}



public class Student extends People{

    @Override
    public String writeMain() {
        return "我是学生我爱看书xxxxx";
    }
}


public class Teacher extends People{
    @Override
    public String writeMain() {
        return "我是老师,我要看名著";
    }
}

// 测试
public class Test {
    public static void main(String[] args) {
        People s1 = new Student();
        s1.write();

        System.out.println("===============");
        People t1 = new Teacher();
        t1.write();
    }

}

测试结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接口

java提供了关键字interface,用这个关键字可以定义一个特殊的结构:接口

在这里插入图片描述

在jdk1.8之前,接口中只能定义成员变量和抽象方法

在这里插入图片描述

在这里插入图片描述

接口的好处

1、弥补了类单继承的不足,一个类可以同时实现多个接口

2、让程序可以面向接口编程,这样程序更加灵活。(多态

代码实现

public class Test {
    public static void main(String[] args) {

    }
}


class A extends Student implements Driver, Singer{

    @Override
    public void drive() {
        System.out.println("我继承了student,并且会开车");
    }

    @Override
    public void song() {
        System.out.println("我继承了student,并且会唱歌");
    }
}

class Student{

}

interface Driver{
    void drive();
}

interface Singer{
    void song();
}

总结

继承就像在说你是谁,你来自哪里哪一类。

接口就好像在说你会什么,有什么能力,你被贴了什么标签,例如歌手标签,

综合案例

在这里插入图片描述

代码实现

// 测试类
public class Test {
    public static void main(String[] args) {
        ClassManage classManage = new ClassManage(new StudentOperatorImpl2());
        ArrayList<Student> students = classManage.getStudents();
        students.add(new Student("迪丽热巴",false,99));
        students.add(new Student("古力娜扎",false,100));
        students.add(new Student("马尔扎哈",true,95));
        students.add(new Student("卡尔扎巴",true,92));

        classManage.studentOperator.printAllInfo(classManage.getStudents());

        classManage.studentOperator.printAverageScore(classManage.getStudents());
    }
}

学生类

public class Student {
    private String name;
    private boolean sex;
    private double score;

    public Student() {
    }

    public Student(String name, boolean sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

班级管理类

public class ClassManage {
    private ArrayList<Student> students;
    StudentOperator studentOperator;

    public ClassManage(StudentOperator operator) {
        this.studentOperator = operator;
        this.students = new ArrayList<>(10);
    }

    public void addStudent(Student student){
        students.add(student);
    }

    public ArrayList<Student> getStudents() {
        return students;
    }
}

操作接口

public interface StudentOperator {
    void printAllInfo(ArrayList<Student> students);

    void printAverageScore(ArrayList<Student> students);
}

接口实现类1

public class StudentOperatorImpl1 implements StudentOperator {

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("--------全班全部学生信息如下----------");
        students.forEach(student -> {
            System.out.println("姓名:" + student.getName());
            System.out.println("性别:" + student.isSex());
            System.out.println("成绩:" + student.getScore());
        });
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        System.out.println("-------全班学生平均成绩如下-----------");
        double sum = 0.0;
        for (Student student : students) {
            sum += student.getScore();
        }
        System.out.println("全班的平均成绩为:" + sum / students.size());
    }
}

接口实现类2

public class StudentOperatorImpl2 implements StudentOperator {

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("--------全班全部学生信息如下----------");
        int male = 0;
        int female = 0;
        for (Student student : students) {
            System.out.println("姓名:" + student.getName());
            System.out.println("性别:" + student.isSex());
            System.out.println("成绩:" + student.getScore());
            if (student.isSex()) {
                male++;
            } else {
                female++;
            }
        }
        System.out.println("男生人数:" + male + ", 女生人数:" + female);
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double max = 0.0;
        double min = 101.0;
        double sum = 0.0;
        for (Student student : students) {
            max = Math.max(max, student.getScore());
            min = Math.min(min, student.getScore());
            sum += student.getScore();
        }
        System.out.println("全班的平均成绩为:" + ((sum - max - min) / (students.size() - 2)));
    }
}

为什么实现的这么复杂呢?因为这样设计的好处就在于可以仅仅改变下图这一个地方就可以改变不同的实现方案。

在这里插入图片描述

JDK8以后接口新增的内容

默认方法:如果接口只有默认方法,那么实现类就可以直接使用。

public class Test2 {
    public static void main(String[] args) {
        AImpl a1 = new AImpl();
        a1.test1();
    }
}

interface A{
    // 新增的默认方法。
    // 必须使用default 修饰

    public default void  test1(){
        System.out.println("===默认方法===");
    }
}

class AImpl implements A{

}

结果展示

在这里插入图片描述

私有方法

jdk9以后才有的新特性,私有方法和默认方法能够访问私有方法。

在这里插入图片描述

静态方法

必须使用static修饰,直接使用接口调用。

在这里插入图片描述

总结

在这里插入图片描述


有时候你会迷茫学这些干嘛?这些是java的基础特性,就是要背诵或者熟练使用的,就好像数学中懂了加法和乘法才会数学运算一样,因此需要熟练掌握。

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

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

相关文章

随笔03 笔记整理

图源&#xff1a;文心一言 关于我的考研与信息安全类博文整理~&#x1f95d;&#x1f95d; 第1版&#xff1a;整理考研类博文~&#x1f9e9;&#x1f9e9; 第2版&#xff1a;提前列出博文链接&#xff0c;以便小伙伴查阅~&#x1f9e9;&#x1f9e9; 第3版&#xff1a;整理We…

学习记录-自动驾驶与机器人中的SLAM技术

以下所有内容均为高翔大神所注的《自动驾驶与机器人中的SLAM技术》中的内容 融合导航 1. EKF和优化的关系 2. 组合导航eskf中的预测部分&#xff0c;主要是F矩阵的构建 template <typename S> bool ESKF<S>::Predict(const IMU& imu) {assert(imu.timestamp…

基于杂交PSO算法的风光储微网日前优化调度(MATLAB实现)

微网中包含&#xff1a;风电、光伏、储能、微型燃气轮机&#xff0c;以最小化电网购电成本、光伏风机的维护成本、蓄电池充放电维护成本、燃气轮机运行成本及污染气体治理成本为目标&#xff0c;综合考虑&#xff1a;功率平衡约束、燃气轮机爬坡约束、电网交换功率约束、储能装…

Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署

文章目录 Elasticsearch_8.11.4_kibana_8.11.4_metricbeat_8.11.4安装及本地部署_ELK日志部署分布式引擎Elasticsearch_8.11.4安装及本地部署系统环境要求1 Windows 安装 Elasticsearch下载完成后进行解压,进入 bin 目录,找到elasticsearch.bat脚本文件执行一键启动.启动都选允…

【Python学习】Python学习15-模块

目录 【Python学习】Python学习15-模块 前言创建语法引入模块from…import 语句from…import* 语句搜索路径PYTHONPATH 变量-*- coding: UTF-8 -*-导入模块现在可以调用模块里包含的函数了PYTHONPATH 变量命名空间和作用域dir()函数globals() 和 locals() 函数reload() 函数Py…

ROS2学习笔记一:安装及测试

目录 前言 1 ROS2安装与卸载 1.1 安装虚拟机 1.2 ROS2 humble安装 2 ROS2测试 2.1 topic测试 2.2 小海龟测试 2.3 RQT可视化 2.4 占用空间 前言 ROS2的前身是ROS&#xff0c;ROS即机器人操作系统&#xff08;Robot Operating System&#xff09;,ROS为了“提高机器人…

原生js实现拖拽效果

<!DOCTYPE html> <html> <head> <style> #mydiv { width: 200px; height: 200px; background-color: red; position: absolute; cursor: move; } </style> | </head> <body> <div id"mydiv">拖拽我…

基于java web的机票管理系统设计与实现设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

机器学习扩散模型简介

一、说明 扩散模型的迅速崛起是过去几年机器学习领域最大的发展之一。在这本易于理解的指南中了解您需要了解的有关扩散模型的所有信息。 扩散模型是生成模型&#xff0c;在过去几年中越来越受欢迎&#xff0c;这是有充分理由的。仅在 2020 年代发布的几篇开创性论文就向世界…

socket.io分房间交流

基本详情看这里 Socket.IO 是一个库,可以在客户端和服务器之间实现 低延迟, 双向 和 基于事件的 通信. 效果展示 安装依赖 // 后端插件安装 npm i socket.io -S // 前端插件安装 npm i socket.io-client -S 前端搭建及逻辑 <script setup> import { ref, onMounted…

机器学习 | 卷积神经网络

机器学习 | 卷积神经网络 实验目的 采用任意一种课程中介绍过的或者其它卷积神经网络模型&#xff08;例如LeNet-5、AlexNet等&#xff09;用于解决某种媒体类型的模式识别问题。 实验内容 卷积神经网络可以基于现有框架如TensorFlow、Pytorch或者Mindspore等构建&#xff…

Vue2脚手架配置教程IDEA配置VUE

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目&#xff0c;运行项目

React 原理

函数式编程 纯函数 reducer 必须是一个纯函数&#xff0c;即没有副作用的函数&#xff0c;不修改输入值&#xff0c;相同的输入一定会有相同的输出不可变值 state 必须是不可变值&#xff0c;否则在 shouldComponentUpdate 中无法拿到更新前的值&#xff0c;无法做性能优化操作…

Linux网络服务部署yum仓库

目录 一、网络文件 1.1.存储类型 1.2.FTP 文件传输协议 1.3.传输模式 二、内网搭建yum仓库 一、网络文件 1.1.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff0…

服务拆分及远程调用

分布式架构都离不开服务的拆分&#xff0c;微服务也是一样。 1.微服务拆分 不同微服务&#xff0c;不要重复开发相同业务 微服务数据独立&#xff0c;不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口&#xff0c;供其它微服务调用 2.远程调用 以前时&#xf…

Halcon提取亚像素轮廓edges_sub_pix算子

Halcon提取亚像素轮廓edges_sub_pix算子 最常用的提取亚像素轮廓的算子是edges_sub_pix算子&#xff0c;该算子同样提供了大量的提取方法&#xff0c;只需要在Filter 参数中设置方法的名字&#xff0c;就可以完成边缘的提取。该算子的输入是灰度图像&#xff0c;输出是XLD轮廓…

BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)

一、介绍 BurpSuite是渗透测试、漏洞挖掘以及Web应用程序测试的最佳工具之一&#xff0c;是一款用于攻击web 应用程序的集成攻击测试平台&#xff0c;可以进行抓包、重放、爆破&#xff0c;包含许多工具&#xff0c;能处理对应的HTTP消息、持久性、认证、代理、日志、警报。 …

使用scipy处理图片——滚动图片

大纲 常规模式constant和grid-constant 交换模式wrap和grid-wrap 镜像reflect、mirror和grid-mirror 最近值nearest 代码 在《使用numpy处理图片——滚动图片》一文中&#xff0c;我们介绍了numpy的roll方法&#xff0c;它只能让超出区域的元素回到被移动的区域中&#xff0c;如…

图像提取大师:轻松从指定时长中获取某帧的图片,视频剪辑方法

在数字媒体时代&#xff0c;视频和图像已成为生活中不可或缺的部分。要从视频中提取某一帧作为图片&#xff0c;或者在视频剪辑时要采用其他的方法来达到需求的效果。下面来看云炫AI智剪如何轻松地从指定时长的视频中获取某帧的图片&#xff0c;视频剪辑的新方法。 视频中按指定…

Spring Cloud中的提供者与消费者

在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用…