「JavaSE」抽象类接口2

🎇个人主页:Ice_Sugar_7
🎇所属专栏:快来卷Java啦
🎇欢迎点赞收藏加关注哦!

抽象类&接口2

  • 🍉接口间的继承
  • 🍉接口的应用
  • 🍉总结

🍉接口间的继承

和类的继承一样,接口之间存在继承的关系,不过我们叫作拓展,就是说一个接口在另一个接口的基础上,拓展了其他功能。接口的拓展也是使用关键字extends

public interface A {void test1();
}public interface B extends A{void test2();
}public class TestDemo1 implements B{@Overridepublic void test1() {  //需要重写接口A中的方法}@Overridepublic void test2() {}
}

接口间的拓展相当于把多个接口合并为一个接口

🍉接口的应用

有了接口,我们可以给对象数组数组元素是一个个对象)排序

  1. Comparable接口
public class Student implements Comparable<Student>{private String name;private int grade;  //学生成绩
}

比如要给学生类排序,给出一个学生类的数组,我们希望按照成绩进行排序

Arrays类中的sort方法可供我们对数组元素排序
但是sort只能对内置类型进行排序,因为两个内置类型变量的大小关系是明确的。而对于学生类,两个学生对象的大小关系是需要我们自己指定的,即我们自己确定比较的标准

那怎么确定标准呢?这就需要我们的 Student 类实现 Comparable 接口, 并实现其中的compareTo 方法

Comparable接口是Java自带的接口,实现时需要在后面加上<类类型>,表示这个类型可以进行比较,其中这个“类类型”表示我们想要进行比较的类型

public class Student implements Comparable<Student> {//...
}
public class Student implements Comparable<Student>{private String name;private int grade;public Student(String name, int grade) {this.name = name;this.grade = grade;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", grade=" + grade +'}';}@Overridepublic int compareTo(Student o) {  //compareTo方法的形参类型是Object,不过使用idea生成时,会自动调整为你要比较的类型if(this.grade > o.grade) {return 1;} else if (this.grade == o.grade) {return 0;} else {return -1;}}
}

那对于这样一组数据:

    public static void main(String[] args) {Student students[] = new Student[]{new Student("张三", 98),new Student("李四", 99),new Student("王五", 85),new Student("Sugar", 88)};Arrays.sort(students);for (Student student:students) {System.out.println(student);}}

排序后就是:
在这里插入图片描述
小结:

  • sort 要求传入的数组的每个对象都是“可比较”的,也就是说对象中的某个成员变量可以进行比较(比如姓名、年龄等)。这样通过重写 compareTo 方法就可以定义比较规则

不过这种方法是把比较的方法写在类里面,如果原先是按成绩进行排序,现在要改成按姓名或者其他属性比较的话,那就要把整个方法都改了,不太方便

  1. Comparator接口
    在这里插入图片描述
    Comparator接口中有一个compare方法
    在这里插入图片描述

Arrays的sort方法提供多种重载,其中一个的参数列表是对象数组比较器
在这里插入图片描述

我们只要实现comparator接口(比较器),重写里面的compare方法就可以进行比较

以对学生成绩排序为例

public class Student{private String name;private int grade;public Student(String name, int grade) {this.name = name;this.grade = grade;}public String getName() {return name;}public int getGrade() {return grade;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", grade=" + grade +'}';}
}public class GradeComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.getGrade()- o2.getGrade();}
}public class Main {public static void main(String[] args) {GradeComparator gradeComparator = new GradeComparator();Student[] array = {new Student("张三",98),new Student("李四",99),new Student("王五",85),new Student("Sugar",88)};Arrays.sort(array,gradeComparator);System.out.println(Arrays.toString(array));}
}

在这里插入图片描述

使用比较器是在实现比较器的类中(GradeComparator)重写compare方法,而不是在待比较的对象所属的类(Student)之中
这样就比较灵活,我们想按对象的什么属性来比较排序,就新建一个类,按我们的需求重写compare方法

Moreover,我们可以尝试实现一个sort方法,加深对接口的理解。下面以直接插入排序为例:

public class insertSort {public static void InsertSort(Comparable[] comparables) {for(int i = 0;i < comparables.length - 1;i++) {int end = i;for(int j = end;j >= 0;j--) {if(comparables[j].compareTo(comparables[j+1])>0) {Comparable tmp = comparables[j];comparables[j] = comparables[j+1];comparables[j+1] = tmp;}}}}
}public class Student implements Comparable<Student>{private String name;private int grade;public int compareTo(Student o) {  //以grade作为比较排序的标准return this.grade - o.grade;}
}public class Main {public static void main(String[] args) {Student[] students = {new Student("张三",98),new Student("李四",99),new Student("王五",85),new Student("Sugar",88)};insertSort.InsertSort(students); //通过类名调用insertSort类中的方法System.out.println(Arrays.toString(students));}
}

直接插入排序的具体实现可以看这篇文章:「数据结构」八大排序1


🍉总结

  1. 接口的继承关系——拓展,它可以拓展接口的功能
  2. 通过重写Comparable接口或Comparator接口下的方法,我们可以实现对象类型的比较

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

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

相关文章

【每日一题】最长交替子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;双层循环方法二&#xff1a;单层循环 写在最后 Tag 【双层循环】【单层循环】【数组】【2024-01-23】 题目来源 2765. 最长交替子数组 解题思路 两个方法&#xff0c;一个是双层循环&#xff0c;一个是单层循环。 方法一&am…

yarn集群HDFS datanode无法启动问题排查

一、问题场景 hdfs无法访问&#xff0c;通过jps命令查看进程&#xff0c;发现namenode启动成功&#xff0c;但是所有datanode都没有启动&#xff0c;重启集群&#xff08;start-dfs.sh&#xff09;后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

线程池中线程数量与队列大小参数的如何设置实践-基于QPS的计算公式

目录 概要 传统方式? 线程池理解? 基于QPS的设置思路? 总结? 概要 线程池是个既靠谱但又陌生的家伙, 像管家一样, 会踏踏实实的把你交代的任务完成, 但很死板, 没有自动安排人的能力, 需要你给它配好人手(线程实例)和承载容量(队列大小), 这些参数关系影响业务服务整体…

rabbitmq基础-java-5、Topic交换机

1、简介 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。 只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符&#xff01; BindingKey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以.分割&#x…

使用Python的pygame库实现迷宫游戏

使用Python的pygame库实现迷宫游戏 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图&#xff1a; 这个游戏能自动生成迷宫布局。 在这个游戏中&#xff0c;玩家将使用键盘箭头键来移动&#xff0c;并且目标…

深入了解达梦数据库的增删查改操作:从入门到精通

目录 前言&#xff1a; 一.达梦数据库的增删改查 1.创建数据库 2.插入数据 3.查看数据 4.删除数据 5.数据 前言&#xff1a; 在当今数字化的时代&#xff0c;数据库已经成为企业和组织的核心资产&#xff0c;是实现高效数据处理、存储和管理的重要工具。达梦数据库&…

测试用例评审流程

1:评审的过程 A:开始前做好如下准备 1、确定需要评审的原因 2、确定进行评审的时机 3、确定参与评审人员 4、明确评审的内容 5、确定评审结束标准 6、提前至少一天将需要评审的内容以邮件的形式发送给评审会议相关人员。并注明详审时间、地点及偿参与人员等。 7、 在邮件中提醒…

科创板交易规则科普

一、交易时间&#xff1a; 交易日的上午9:30-11:30&#xff0c;下午13:00-15:00&#xff0c;其中9:15-9&#xff1a;25是开盘价公布以及竞价的时间&#xff0c;15:05-15:30是盘后固定价格交易时间。 二、买卖原则&#xff1a; 科创板实行T1交易&#xff0c;按照市场实时价格…

Linux运维实战:CentOS7.6操作系统(Shell脚本基础)

文章目录 第19章 Shell脚本基础19.1 Shell基本语法19.1.1 什么是Shell19.1.2 编程语言分类1.低级语言2.高级语言19.1.3 什么是Shell脚本19.2 Shell变量及运用19.2.1 Shell变量1.变量的设置规则如下2.按照变量的作用可以分成以下4类3.按照变量的作用域可以把变量分成两类:…

音乐证书通过率发布,市场对持有者需求旺盛

音乐证书的考试难度备受关注&#xff0c;通过率终于揭晓。据官方公布的数据&#xff0c;该证书的通过率相对较低&#xff0c;需要考生在音乐技能和表现方面有出色的表现。然而&#xff0c;持有音乐证书的人才在市场上需求旺盛&#xff0c;各种音乐机构和企业对其表现出强烈兴趣…

SpringBoot整合ElasticSearch实现分页查询

本文使用SpringBoot整合ElasticSearch实现分页查询 文章目录 环境准备分页查询方式一方式二 本文小结 环境准备 还是继续使用spring-boot-starter-data-elasticsearch来实现分页查询操作 <!-- spring-boot-starter-data-elasticsearch--> <dependency><groupId&…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

antv/g6绘制数据流向图

antv/g6绘制数据流向图 前言接口模拟数据htmlts页面效果 前言 在业务开发中需要绘制数据流向图&#xff0c;由于echarts关系图的限制以及需求的特殊要求&#xff0c;转而使用antv/g6实现&#xff0c;本文以代码的方式实现数据流向需求以及节点分组,版本"antv/g6": “…

从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

本篇文章的内容 一、RISC-V汇编语言简介1.1 RISC-V 汇编语言的基本格式1.2 RISC-V 汇编指令操作对象1.3 RISC-V 汇编指令编码格式1.4 RISC-V 汇编指令分类 二、RISC-V汇编语言详解2.1 add 加法指令2.2 sub 减法指令 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习…

linux条件判断练习

1.实现自动生成相应的压缩包 1.写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-…

PPP协议原理介绍+报文分析+配置指导-RFC1661

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PPP协议报文的基础上进行介绍。 关于PPP协议基本原理&#xff0c;可参考RFC1661-The Point-to-Point Protocol (PPP)。 关于P…

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种&#xff1a;相对、绝对路径。 相对路径&#xff1a;相对于当前位置的路径&#xff0c;以“./xxx.xxx”为标志绝对路径&#xff1a;以从盘符…

手动导入jar包到Maven的解决方案(简单有效!)

想要导入一个jar包到项目中&#xff0c;这个jar包在Maven中没有可以尝试以下方式。 第一步 先找到你maven的本地仓库&#xff0c;我的仓库就在这里&#xff0c;你可以根据你安装的maven找到你的目录 第二步 根据坐标创建文件夹。 这个依赖modbus4j.jar&#xff0c;Maven远…

PyQt ------ QTextEditor

PyQt ------ QTextEditor 引言正文示例1------进阶示例 引言 这里给大家介绍一下 PyQt6 中的 QTextEditor 组件用法。 正文 QTextEditor 可以进行多行字符串输出的组件。 想要获取 QTextEditor 组件中当前存放的字符串&#xff0c;需要使用&#xff1a; QTextEditor.toPla…

《GreenPlum系列》GreenPlum初级教程-GreenPlum详细入门教程

文章目录 GreenPlum详细入门教程第一章 GreenPlum介绍1.MPP架构介绍2.GreenPlum介绍3.GreenPlum数据库架构4.GreenPlum数据库优缺点 第二章 GreenPlum单节点安装1.Docker创建centos容器1.1 拉取centos7镜像1.2 创建容器1.3 进入容器1.4 容器和服务器免密操作1.4.1 生成密钥1.4.…