JavaSE——面向对象高级二(3/4)-接口(认识接口、接口的好处)以及接口的综合案例(设计班级学生的信息管理模块)

news2024/11/28 0:32:47

目录

接口

认识接口

接口的好处

接口的综合案例

需求

学生类

班级管理类

学生操作接口

学生操作类

完善班级管理类

测试


接口

认识接口

  • Java提供了一个关键字 interface,用这个关键字我们可以定义出一个特殊的结构:接口。
public interface 接口名{
    //成员变量(常量)
    //成员方法(抽象方法)
}

 在接口中,不需要将变量用final修饰成常量,它会自动转为常量,例如:

public interface A{
    double R = 3.14;
    //相当于 public static final double r = 3.14;
}

注意:常量建议使用大写来命名。

方法也同样,接口会自动将方法转为抽象方法,例如:

public interface A{
    void run();
    //相当于public abstract void run();
}

故而接口中的方法只能有签名,不能有方法体。

注意:接口不能创建对象;接口是用来被类实现(implements),实现接口的类称为实现类

修饰符 class 实现类 implements 接口1,接口2,接口3,...{

}

  • 一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。 

接口的好处

  • 弥补了类单继承的不足,一个类同时可以实现多个接口。
  • 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。

例如下面这种情况,一个类继承了几个类之后就不能再继承其他类了,这时需要其他功能就可以用接口来实现了。

public class Test{
    public static void main(String[] args){
        Student s = new A();
    }
}

class Student{

}

class A extends Student{

}

接口为其拓展更多功能:

public class Test{
    public static void main(String[] args){
        Singer s = new A(); //或是 Driver s = new A();
    }
}

class A extends Student implements Driver,Singer{

    @override
    public void drive{
    }

    @override
    public void sing{
    }

}

class Student{

}


interface Driver{
    void drive();
}

interface Singer{
    void sing();
}

1.使用接口有啥好处,第一个好处是什么?

  • 可以解决类单继承的问题,通过接口,我们可以让一个类有一个亲爹的同时,还可以找多个干爹去扩展自己的功能。

2.为什么我们要通过接口,也就是去找干爹,来扩展自己的功能呢?

  • 因为通过接口去找干爹,别人通过implements的接口,就可以显性地知道你是谁,从而也就可以放心地把你当作谁来用了。

3.使用接口的第二个好处是什么?

  • 一个类我们说可以实现多个接口,同样,一个接口也可以被多个类实现。这样做的好处是我们的程序就可以面相接口编程了,这样我们程序员就可以很方便的灵活切换各种业务实现了。

接口的综合案例

需求

请设计一个班级学生的信息管理模块:学生的数据有:姓名、性别、成绩

功能1:要求打印出全班学生的信息;

功能2:要求打印出全班学生的平均成绩。


注意!以上功能的业务实现是有多套方案的,比如:

  • 第1套方案:能打印出班级全部学生的信息;能打印班级全部学生的平均分。
  • 第2套方案:能打印出班级全部学生的信息(包含男女人数);能打印班级全部学生的平均分(要求是去掉最高分、最低分

要求:系统可以支持灵活的切换这些实现方案。

先定义出基本的学生类:

学生类

package user.interfaceDemo;

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

    public Student() {
    }

    public Student(String name, char 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 char getSex() {
        return sex;
    }

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

    public double getScore() {
        return score;
    }

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

因为我们要设计班级学生的信息管理模块,所以接下来把班级管理类定义出来,其中有包含学生的班级集合以及班级里面的学生信息。

班级管理类

package user.interfaceDemo;

import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student> students = new ArrayList<>();

    //构造器初始化出班级内部的信息
    public ClassManager(){
        students.add(new Student("余周周",'女',99));
        students.add(new Student("林杨",'男',100));
        students.add(new Student("蒋川",'男',80));
        students.add(new Student("凌翔茜",'女',90));
    }

    //打印出全班学生的信息
    public void printInfo(){

    }

    //打印出全班学生的平均成绩
    public void printScore(){

    }
}

实现的方法这部分因为要能够灵活切换,所以需要用接口实现,先空着,去定义接口。

学生操作接口

package user.interfaceDemo;

import java.util.ArrayList;

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

下面就定义两个学生操作类,在学生操作类中去实现学生操作接口,分别重写接口的两个方法。

学生操作类

第一套方案:

package user.interfaceDemo;

import java.util.ArrayList;

public class StudentOperatorImp1 implements  StudentOperator{

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("=======全班所有学生信息如下=======");
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:" + s.getName());
            System.out.println("性别:" + s.getSex());
            System.out.println("分数:" + s.getScore());
            if(i != students.size() - 1){
                System.out.println("--------------------");
            }
        }
        System.out.println("========================");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            allScore += s.getScore();
        }
        System.out.println("该班级的平均分为:" + ( allScore / students.size() ));
    }
}

第二套方案:

package user.interfaceDemo;

import java.util.ArrayList;

public class StudentOperatorImp2 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("=======全班所有学生信息如下=======");
        int count1 = 0;  //用于记录男生的数量
        int count2 = 0;  //用于记录女生的数量
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:" + s.getName());
            System.out.println("性别:" + s.getSex());
            System.out.println("分数:" + s.getScore());
            if(i != students.size() - 1){
                System.out.println("--------------------");
            }
            if(s.getSex() == '男'){
                count1++;
            }else{
                count2++;
            }
        }
        System.out.println("男生人数为:" + count1 + "人");
        System.out.println("女生人数为:" + count2 + "人");
        System.out.println("班级总人数为:" + students.size() + "人");
        System.out.println("========================");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        double max = students.get(0).getScore();
        double min = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            if(s.getScore() > max) max = s.getScore();
            if(s.getScore() < min) min = s.getScore();
            allScore += s.getScore();
        }
        System.out.println("该班级的最高分是:" + max + "分");
        System.out.println("该班级的最低分是:" + min + "分");
        System.out.println("该班级的平均分为:" + ( (allScore - max - min) / (students.size() - 2) ));
    }
}

 接下来回到班级管理类,完善功能:

完善班级管理类

package user.interfaceDemo;

import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student> students = new ArrayList<>();
    //创建出学生操作对象,给下面的方法进行调用,其中StudentOperatorImp1可以替换为StudentOperatorImp2,功能就进行了变化.
    private StudentOperator studentOperator = new StudentOperatorImp1();

    //构造器初始化出班级内部的信息
    public ClassManager(){
        students.add(new Student("余周周",'女',99));
        students.add(new Student("林杨",'男',100));
        students.add(new Student("蒋川",'男',80));
        students.add(new Student("凌翔茜",'女',90));
    }

    //打印出全班学生的信息
    public void printInfo(){
        studentOperator.printAllInfo(students);
    }

    //打印出全班学生的平均成绩
    public void printScore(){
        studentOperator.printAverageScore(students);
    }
}

测试

package user.interfaceDemo;

public class Test {
    public static void main(String[] args) {
        ClassManager cc = new ClassManager();
        cc.printInfo();
        cc.printScore();
    }
}

 第一套方案的运行结果:

改为第二套方案:

第二套方案的运行结果为:

 


END 


学习自:黑马程序员——JavaSE课程 

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

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

相关文章

个人网站制作 Part 13 添加搜索功能[Elasticsearch] | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加搜索功能&#x1f528;使用Elasticsearch&#x1f527;步骤 1: 安装Elasticsearch&#x1f527;步骤 2: 配置Elasticsearch&#x1f527;步骤 3: 创建索引 &#x1f…

[论文笔记] Dual-Channel Span for Aspect Sentiment Triplet Extraction

一种利用句法依赖和词性相关性信息来过滤噪声&#xff08;无关跨度&#xff09;的基于span方法。 会议EMNLP 2023作者Pan Li, Ping Li, Kai Zhang团队Southwest Petroleum University论文地址https://aclanthology.org/2023.emnlp-main.17/代码地址https://github.com/bert-ply…

长安链Docker Java智能合约引擎的架构、应用与规划

#功能发布 长安链3.0正式版发布了多个重点功能&#xff0c;包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 在《2022年度长安链开源社区开发者调研报告》中&#xff0c;对Java合约语言支持是开…

ideaSSM 财务凭证管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 财务凭证管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)

目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍 在机器视觉的开发中&#xff0c;现在有很多通过电机去做相机的聚焦调节&#xff0c;对比手工调节&#xff0c;自动调节效果更好&#xff0c;而且其也能满足设备自动的需求&#xff0c;尤…

高效的Gitlab Flow最佳实践

文章目录 一、git flow二、github flow三、gitlab flow四、基于gitlab flow的最佳实践1.语义化版本号2.测试发布3.bug修复 参考 业界包含三种flow&#xff1a; Git flowGithub flowGitlab flow 三种工作流程&#xff0c;有一个共同点&#xff1a;都采用"功能驱动式开发&…

圆弧齿的模型怎么建立?

今天咱们聊一聊圆弧齿的相关内容&#xff0c;有兴趣的小伙伴一起来看看吧。 圆弧齿轮发展历史 早期齿轮传动的速度较低、传递的功率小&#xff0c;长期的生产实践使得人们开始意识到对齿轮单个轮齿形状&#xff08;轮齿齿形&#xff09;的研究的重要性&#xff0c;齿轮的齿形…

5G安全技术新突破!亚信安全5G安全迅龙引擎正式发布

5G专网应用飞速增长&#xff1a;2020年5G专网数量800个&#xff0c;2021年2300个&#xff0c;2022年5325个&#xff0c;2023年已经超过16000个&#xff0c;5G与垂直行业的融合快速加深&#xff0c;5G带来的变革正加速渗透至各行各业。 5G网络出现安全问题&#xff0c;将是异常严…

MNN createFromBuffer(一)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

C语言例3-12:自增和自减运算的例子

i 先引用后加1--i 先减1后引用 代码如下&#xff1a; #include<stdio.h> int main(void) {int i2, j2;char c1d, c2D; //d(100) D(68)printf("i %d\n",i); //3, i3printf("j-- %d\n",j--); …

Design Script之案例练习:曲线组合

让我们来探索一下如何创建分组曲线函数。这个函数将取一个无序曲线列表(必须是连续的),并将它们组合成分组的循环。 在这个例子中,我们将采取一系列的9个爆炸矩形,并洗牌合成曲线。这给了我们36条单独的曲线,它们可以正确地组合回各自的矩形中。 一些分散的曲线显示在右边…

发布镜像到阿里云仓库

发布上一篇Dockerfile实战-自定义的centos镜像。 1、登录阿里云 2、找到容器镜像服务 3、创建命令空间 4、创建镜像仓库 5、点击进入这个镜像仓库&#xff0c;可以看到所有的信息 6、根据操作指南测试推送发布 6.1登录阿里云 [rootzhoujunru home]# docker login --usernam…

数据仓库系列总结

一、数据仓库架构 1、数据仓库的概念 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 数据仓库通常包含多个来源的数据&#xff0c;这些数据按照主题进行组织和存储&#x…

mapboxgl添加雪碧图 addImage loadImage png/jpg svg

一、mapboxgl可以添加png或者jpg类型的图片到雪碧图中 async function addPng(id, url) {const img await new Promise((resolve) > {map.loadImage(url, (error, image) > {if (error) throw error;resolve(image);});});if (!map.hasImage(id)) {map.addImage(id, img…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…

【目标检测】图解 YOLOv3 的网络结构(Darknet-53 作为 backbone)

到了 YOLOv3&#xff0c;backbone 从 YOLOv2 的 Darknet-19 升级到了 Darknet-53。 下面一张完整的结构示意图来一起理解一下 YOLOv3 的网络结构。 我们怎么理解最后输出的 3 个特征图&#xff08;feature map&#xff09;的这个 255&#xff1f; 同 YOLOv2 一样&#xff0c;…

常见传感器的原理 和 常见滤波算法实现

阅读引言&#xff1a; 分析常见的传感器的电路原理、向大家提供一些ADC常见的滤波算法的实现, 介绍声、光、热、电、力、气和磁传感器的大致工作原理。 目录 一、常见传感器工作原理 1.声音传感器-动圈&电容咪头 2.光传感器-光敏电阻 3.热传感器-热电偶 4.电传感器-电…

YOLOv8改进 | 主干篇 | 利用图像分割网络UNetV2改善图像分割检测性能(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用图像分割网络UNetV2的主干来改进我们的YOLOv8分割模型&#xff08;本文的内容虽然YOLOv8所有的功能的用户都能使用&#xff0c;但是还是建议分割的用户使用&#xff09;&#xff0c;U-Net v2 旨在改进医学图像分割的性能&#xff…

Spring-Gateway服务网关

一、网关介绍 1. 为什么需要网关 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由 权限控制 限流 架构图&#xff1a; 权限控制&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否有请求资格&am…

Zerotier 异地组网方案初探

前言 我之前想要异地组网的话&#xff0c;一般都采用内网穿透的方法&#xff0c;但是这个内网穿透有弊端就是都是要通过公网服务器转发流量&#xff0c;对于大流量的传输就比较不方便&#xff0c;我发现了Zerotier 这个工具非常的好用&#xff0c;是基于p2p的 这是一个类似于…