「JavaSE」抽象类接口2

news2024/12/23 0:02:03

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

抽象类&接口2

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

🍉接口间的继承

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

public interface A {
    void test1();
}

public interface B extends A{
    void test2();
}

public class TestDemo1 implements B{
    @Override
    public void test1() {  //需要重写接口A中的方法

    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }
}

public class GradeComparator implements Comparator<Student> {
    @Override
    public 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.coloradmin.cn/o/1408434.html

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

相关文章

Java--异常处理

文章目录 主要内容一.练习11.源代码代码如下&#xff08;示例&#xff09;: 2.结果 二.练习21.源代码代码如下&#xff08;示例&#xff09;: 2.结果 三.练习31.源代码代码如下&#xff08;示例&#xff09;: 2.结果 总结 主要内容 一.练习1 编写程序&#xff0c;定义一个 cir…

FRRouting学习(一) 配置日志文件

以配置isis event事件日志为例 1、在配置之前&#xff0c;/var/log/frr路径下是没有文件的&#xff1a; 2、在vtysh config之下输入&#xff1a;log file /var/log/frr/isisd.log debugging 后面的debugging表示日志级别&#xff0c;可以根据自己修改 3、配置好了之后&#xf…

力扣hot100 两两交换链表中的节点 双指针

Problem: 24. 两两交换链表中的节点 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { …

力扣hot100 环形链表 快慢指针 哈希 数学公式

Problem: 142. 环形链表 II 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) /** /*** Definition for singly-linked list.* class ListNode {* int val;* …

微信小程序如何做到高效引流?-数灵通

随着微信小程序制作门槛的降低&#xff0c;大量的小程序如雨后春笋般涌现&#xff0c;其中小程序商城类型尤为众多。然而&#xff0c;由于微信自身的流量有限&#xff0c;对于大多数小程序商城而言&#xff0c;获取足够的流量成为了一大挑战。 针对这一问题&#xff0c;我们可以…

如何在Windows 10/11中设置IPv4?这里有详细步骤

在Windows上&#xff0c;路由器的动态主机配置协议&#xff08;DHCP&#xff09;服务器&#xff08;通常&#xff09;负责将动态传输控制协议/互联网协议&#xff08;TCP/IP&#xff09;配置分配给网络中的每个设备&#xff0c;包括运行Windows 11或Windows 10的计算机。 尽管…

链表OJ----相交链表找交点

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 1、长链表先走&#xff0c;然后二者一起走 由于两个链表可能不一样&#xff0c;就不好控制移动。那么我们可以让长的链表先走二者的长度差的长度&#xff0c;使剩下部分和短链表一样长。然后二者一…

操作无法完成,因为文件已在Windows资源管理器中打开,如何解决?以及如何将哔哩哔哩下载好的视频导出到电脑中播放?— 以vivo手机为例

前言 想删除流氓软件的时候&#xff0c;提示操作无法完成&#xff0c;因为文件已在Windows资源管理器中打开&#xff0c;但打开任务管理器&#xff0c;似乎又没有符合的正在执行的程序&#xff0c;更别说打开让人看到头疼的资源监视器了&#xff0c;本文将用一招解决如上问题 …

【RF FILTER 仿真】滤波器 Ansys Electronics not ADS

第一&#xff0c;声明 全网搜索&#xff0c;用这个HFSS继承的介绍非常少&#xff0c;并且没有什么指导意义。所以有必要写一下&#xff0c;就像之前的xpedition,总要挑战一下吧。本文仅仅和大家学习研究&#xff0c;对比ADS体会一下差别。 第二&#xff0c;记录直接开始&…

微信小程序如何解决botton按钮对齐问题

如果botton不在其他控件下层&#xff0c;或者上层控件类型不为flex&#xff0c;可以用float调整botton显示位置&#xff0c;如floatright&#xff0c;则botton显示在右侧。 <button type"primary" style"float: right;">测试</button><vie…

什么是JMeter?我们为什么要用JMeter做性能测试

什么是JMeter&#xff1f;我们为什么要用JMeter做性能测试 什么是JMeter&#xff1f;为什么选择JMeterJMeter的优点JMeter是如何工作的 什么是JMeter&#xff1f; Apache JMeter TM是纯Java开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在…

运维神器Ansible的常用模块

引言&#xff1a;话不多说&#xff0c;今天分享一下Ansible的常用模块&#xff0c;建议收藏哦 1、ping模块 ping模块可以进行主机连通性测试 命令格式 ansible 主机或主机组 -m ping 例&#xff0c;成功显示如下&#xff1a; 2、command 模块 command模块可以直接在远程主机…

条件语句及if语句,case语句

文章目录 条件语句一、测试1、概述格式 2、文件测试2.1 格式2.2 常用操作符 3、比较整数数值3.1 格式3.2 常用操作符 4、字符串比较4.1 格式4.2 常用操作符 5、逻辑测试&#xff08;短路运算&#xff09;5.1 格式5.2 常用操作符 6、双中括号6.1 格式6.2 说明 二、if语句1、单分…

DA14531平台secondary_bootloade工程修改笔记

DA14531平台secondary_bootloade工程修改笔记 1.支持在线仿真 初始时加入syscntl_load_debugger_cfg(); 表示可以重复Jlink连接调试仿真 2.支持串口烧录&#xff0c;和支持单线线写 utilities\secondary_bootloader\includes\bootloader.h /************** 2-wire UART supp…

程序媛的mac修炼手册-- 如何用Python节省WPS会员费

上篇分享了如何用微博爬虫&#xff0c;咱举例爬了女明星江疏影的微博数据。今天就用这些数据&#xff0c;给大家安利一下怎么用Python实现WPS中部分Excel付费功能。 MacOS系统自带的工具&#xff0c;绝大多数都非常顶&#xff0c;除Numbers外。当然&#xff0c;page比起word来&…

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…

vue3实现在浏览器之外打开新窗口,新窗口只有原来的一半并且居中显示

首先在router下的index.js添加路由地址 {name: attribute,path: /attribute,component: () > import(../views/attribute.vue)},然后在方法中调用 //点击按钮 function clicek() {openCenteredWindow(/attribute, 1400, 800);} // 计算居中位置function calculateCenterPos…

live555在拉流时应对多路码流传输带宽问题的几种处理思路

处理带宽管理和调整的机制 Live555库本身并没有直接处理带宽管理和调整的机制&#xff0c;因为它主要是一个用于实现RTSP流媒体服务器和客户端的库&#xff0c;而带宽管理通常是在应用层进行处理的。但Live555支持一些基础协议&#xff0c;这些协议可以在应对带宽问题时进行使用…

qt初入门6:QChar和QString相关接口练习

简单了解编码&#xff1a; ​ latin1&#xff08;ISO 8859-1&#xff09;字符集是对ASCII基本字符集的扩展&#xff0c;都是1字节编码。 Unicode编码有多重存储方案&#xff0c;utf-8使用1~4字节编码&#xff0c;最少1字节&#xff1b;utf-16使用2-4字节编码&#xff0c;最少2字…

Zabbix 整合 Prometheus:案例分享与操作指南

一、简介 Zabbix 和 Prometheus 都是流行的开源监控工具&#xff0c;它们各自具有独特的优势。Zabbix 主要用于网络和系统监控&#xff0c;而 Prometheus 则专注于开源的分布式时间序列数据库。在某些场景下&#xff0c;将这两个工具整合在一起可以更好地发挥它们的优势&#…