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

news2024/11/18 9:41:11

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

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的基础特性,就是要背诵或者熟练使用的,就好像数学中懂了加法和乘法才会数学运算一样,因此需要熟练掌握。

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

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

相关文章

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

51单片机HC-SR04超声波测距lcd1602显示(程序+ad硬件设计+文档说明)

本帖主控使用STC89C52单片机&#xff0c;超声波测距采用HC-SR04模块&#xff0c;包含ad硬件设计和文档。 测距原理 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测出发射和接收回波的时间差t,然后求出距SCt/2,式中的C为超声波波速。由于超声…

Xmind 网页端登录及多端同步

好久没用 Xmind 了&#xff0c;前几天登录网页端突然发现没办法登录了&#xff0c;总是跳转到 Xmind AI 页面。本以为他们不再支持网页端了&#xff0c;后来看提示才知道只是迁移到了新的网址&#xff0c;由原来的 xmind.works 现在改成了的 xmind.ai。又花费好长时间才重新登录…

openEuler安装Docker艰辛路程

文章目录 安装docker测试docker关于windows docker拉取镜像查看所有镜像删除镜像删除不在运行的进程强制删除正在运行的进程 启动docker容器服务-d测试 停止docker容器服务查看docker启动进程更新容器(没有自启动功能&#xff0c;更新为自启动)docker端口映射进入容器修改内容退…

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf

Visual Studio调试模式下无法使用右键菜单将ppt转换到pdf 症状 Visual Studio调试模式下&#xff0c;程序停在断点时&#xff0c;我临时需要将ppt转为pdf&#xff0c;遂右键单击文件&#xff0c;想直接转pdf&#xff0c;奈何光标转了几秒钟&#xff0c;毫无反应。 解决方法 …

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

快速知识付费平台搭建,一分钟搭建你的专属知识服务平台

产品服务 线上线下课程传播 线上线下活动管理 项目撮合交易 找商机找合作 一对一线下交流 企业文化宣传 企业产品销售 更多服务 实时行业资讯 动态学习交流 分销代理推广 独立知识店铺 覆盖全行业 个人IP打造 独立小程序 私域运营解决方案 公域引流 营销转化 …

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

电子招投标全程在线应用安全

电子招投标全程在线应用安全解决方案 电子招投标全程在线应用是指招标人、招标代理机构、投标人、评标专家、监管机构利用公共互联网开展的招标、投标、开标、评标、定标、监管的活动过程。 由于该过程全程在线运行在风险因素较多的公共互联网上&#xff0c;存在电子招投标中…

python爬虫-代理ip理解

目录 1、为什么使用代理IP 2、代理IP 3、IP池 4、代理分类&#xff1a; 5、python中使用代理IP 6、如何找可以使用的代理IP 7、拿到IP后&#xff0c;测试IP的有效性 8、扩展理解正向代理和反向代理 1、为什么使用代理IP 就是为了防止ip被封禁&#xff0c;提高爬虫的效…

隧道应用4-内网穿透EW的简单使用

与netsh端口映射内网类似&#xff0c;也是通过跳板机实现 EW官网地址&#xff1a;http://rootkiter.com/EarthWorm EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 注&#xff1a; 考虑…

sshpass 命令exit code 6 问题解决方法

近期在使用sshpass做自动化交互的脚本&#xff0c;结果运行命令后会返回错误码6,命令如下&#xff1a; sshpass -p 123456 ssh test192.168.1.100 "uname -a" 经搜索资料发现&#xff0c;错误码6指的是Host public key is unknown&#xff0c;也就是说要访问的地址是…

【Java基础(高级篇)】响应式编程

文章目录 1. 概述2. stream 流式编程3. Reactive-Stream4. 响应式编程5. Reactor5.1 Mono和Flux5.2 subscribe()5.3 多线程5.4 常用操作API示例5.5 错误处理5.6 Sinks 工具类 1. 概述 本章将从响应式编程的开始&#xff0c;从 stream 开始逐步递进&#xff0c;如对流式编程或响…

使用 GitHub 远程仓库

使用 GitHub 远程仓库 GitHub 是最大的 Git 版本库托管商&#xff0c;是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub&#xff0c;很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。本篇文章主要带大家上手 GitHub …

element-ui表单验证时undefined (reading ‘validate‘)

我搜索了一下&#xff0c;大部分都是说不仔细造成的&#xff0c;但是我一一对照了 1、el-form中我定义了ref&#xff0c;并且ref前面也是没有加冒号的 2、el-form中也绑定了rules&#xff0c;并且rules前面加了冒号 2、el-form-item我是加了prop的&#xff0c;并且和rules中…

程序员客栈发布《2023程序员自由职业报告》

自2020年以来&#xff0c;自由职业者的生态系统迅速繁荣&#xff0c;从而塑造了一个全新的职业发展模式。2023年&#xff0c;经济形势严峻&#xff0c;但灵活就业形式越来越流行&#xff0c;包括自由职业、远程办公和平台经济等。越来越多的人选择从事自由职业或者利用互联网平…

costmap_2d包介绍

文章目录 一. costmap_2d包介绍二. Costmap包的执行入口-- move_base中调用三. Costmap包的初始化以及维护3.1 Costmap2DROS类3.1.1 构造函数 Costmap2DROS::Costmap2DROS3.1.2 地图更新线程 Costmap2DROS::mapUpdateLoop3.1.3 地图更新 Costmap2DROS::updateMap()3.1.4 激活各…

【HuggingFace Transformer库学习笔记】基础组件学习:Datasets

基础组件——Datasets datasets基本使用 导入包 from datasets import *加载数据 datasets load_dataset("madao33/new-title-chinese") datasetsDatasetDict({train: Dataset({features: [title, content],num_rows: 5850})validation: Dataset({features: [titl…

高级定时器

本节主要介绍以下内容&#xff1a; 定时器简介 高级定时器功能框图讲解 一、定时器简介 定时器功能 &#xff1a;定时、输出比较、输入捕获、断路输入 定时器分类 &#xff1a;基本定时器、通用定时器、高级定时器 定时器资源 &#xff1a;F103有2个高级定时器、4个通…

C#编程-实现委托

实现委托 委托是可以存储对方法的引用的对象。在C#中,委托允许您动态地改变类中方法的引用。 考虑咖啡售货机的示例,它配置不同口味的咖啡,例如卡布奇诺咖啡和黑咖啡。在选择所需口味的咖啡时,售货机决定混合各种成分,例如奶粉、咖啡粉、热水、卡布奇诺咖啡粉。所有的材…