【剧前爆米花--爪哇岛寻宝】

news2024/11/24 12:45:49

作者:困了电视剧

专栏:《JavaSE语法与底层详解》

文章分布:这是一篇关于接口的文章,在本篇文章中我会将接口常用的一些实例进行讲解,以及部分方法在重写中的思想。

 

目录

Comparable和Comparator接口使用

Object类

toString()方法

println中的toString方法

equals()方法


Comparable和Comparator接口使用

现在我们有一个需求,我们定义了一个stu的对象数组,数组中每一个元素是Student类实例化的对象,一个Student对象中又包含姓名,年龄和成绩的属性,代码如下:

public class Javabit_Code {
    public static void main(String[] args) {
        Student[] stu=new Student[3];
        stu[0]=new Student("11",18,11);
        stu[1]=new Student("22",18,22);
        stu[2]=new Student("33",18,33);
        Arrays.sort(stu);
        System.out.println();
    }
}

class Student{
    String name;
    int age;
    int soccer;

    public Student(String name, int age, int soccer) {
        this.name = name;
        this.age = age;
        this.soccer = soccer;
    }

    public Student(){}

}

现在我们要对这个对象数组中的每一个元素按成绩从小到大进行排序,我们应该怎么做?

在之前数组的文章中我提到了Arrays.sort()这个方法,这个方法中其中一个重载的方法可以将传入的数组按从小到大的顺序进行排列,这里我将这个对象数组传进去,因为我的Student对象中有很多属性,而我又没有指明用哪一个属性进行比较,所以程序此时一定会报错。

果然,程序报错了,然后我们通过报错信息点开发生异常的类。

会发现会跳到这部分源码,此时我们可以看到一个神奇的地方,在这一个方法中,它先把Object[]型的a向下转型转换成了Comparable,然后在进行相关的操作,这个Comparable又是什么呢?

一个只包含compareTo这一个方法的接口,此时逻辑关系捋顺了:对于任意一个类,要想实现比较这一个功能必须实现Comparable接口,即在逻辑上就是,这个类实例化的对象都是“可比较的”,然后重写该接口中的compareTo方法,并在调用的时候使用该类重写的方法进行比较。

现在我们修改一下Student类,让他实现一下Comparable接口

class Student implements Comparable<Student> {
    String name;
    int age;
    int soccer;

    public Student(String name, int age, int soccer) {
        this.name = name;
        this.age = age;
        this.soccer = soccer;
    }

    public Student(){}

    public int compareTo(Student student){
        return this.soccer-student.soccer;
    }

}

现在我们来运行一下

 就会发现stu中的对象已经按分数从小到大的顺序排列好了,至于是怎么进行排列的就和sort的底层逻辑有关了,暂时先不说。

比较的问题解决了,但此时我们发现了一个问题,就是在本例中我是想通过分数的大小进行排序,但是如果我的需求变了,变成根据年龄的大小进行排序了怎么办,在重写一个吗?这样不仅麻烦还会造成逻辑上的混乱,况且从逻辑上进行分析Student类本身不像数字,大小那样在逻辑上可以进行比较,Student在逻辑上本身就没有比较这一功能的。

这时候我们怎么办?我们可以设置一些比较器,只要我们想进行需要比较的相关功能,使用对应的比较器就行了,为此我们需要实现Comparator接口,代码如下:

class SoccerComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        return o1.soccer-o2.soccer;
    }
}

class AgeComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        return o1.age-o2.age;
    }
}

方法实现在这里一样,只要返回差值即可,我们在进行相应的方法调用时,需要将对应的比较器也进行调用,就比如我现在想用年龄进行一次排序:

完全可以进行排序。

Object类

Object Java 默认提供的一个类。 Java 里面除了 Object 类,所有的类都是存在继承关系的。默认会继承 Object 父类。即所有类的对象都可以使用Object 的引用进行接收。Object类中包含toString方法和equals方法,所以每个类中都继承了这两个方法,由于使用频率较高,所以初步说明一些常用的用法。

toString()方法

先看一下toString的源码:

运行一段代码,结果如图:

我们可以看到结果按照源码中的规则输出了出来,但是我们在平常调试的过程中,这种形式的输出用的并不是太多吗,我们更多地是需要将这个对象的各个属性进行输出,此时我们就可以重写toString方法,如图:

 

然后我们在进行输出:

 

就会得到我们想要的结果。 

println中的toString方法

还是上述栗子,当我们在输出的时候不使用toString方法会怎么样?

我将输出中的student后面的toString删掉,然后发现运行结果和原先一样,即把这个对象的全部属性都给输出了出来。

 

这是怎么回事?我们打开println的源码看一下 

我们可以看到,当参数为Object时,其方法内部调用了String.valueOf方法,我们点开valueOf

发现最终还是调用了toString方法,所以println的底层是调用了toString的方法,所以只要我们重写了Object中的toString方法,就可以用println直接进行输出。 

equals()方法

Java 中, == 进行比较时:
a. 如果 == 左右两侧是基本类型变量,比较的是变量中值是否相同
b. 如果 == 左右两侧是引用类型变量,比较的是引用变量地址是否相同
c. 如果要比较对象中内容,必须重写 Object 中的 equals 方法,因为 equals 方法默认也是按照地址比较的

 

现在我们有一个需求:在假设每一个学生的姓名都不同的情况下,我想判断两个学生是不是同一个人,该怎么办?

可以通过引用直接进行比较,但那样就没有体现面向对象的封装性,我们可以重写equals方法,在equals方法中进行比较

@Override
    public boolean equals(Object o) {
        //地址一样一定是同一个
        if (this == o) return true;
        //指向null或者类名不一样一定不是同一个
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }

此时,方法就重写完成,我们就可以运行equals这个方法来根据学生的名字判断是不是同一个人了。

以上,就是本篇文章的全部内容,如有疏漏欢迎指正。

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

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

相关文章

JDBC的简单使用与封装

目录 1、JDBC 2、JDBC的常用接口 1.Driver接口 2.Connection接口 3.Statement接口 4.ResultSet接口 3、JDBC的基本使用 1&#xff09;、简单的增删查改 Ⅰ、查 Ⅱ、增 Ⅲ、改 Ⅳ、删 2&#xff09;简单封装 1、JDBC 我们先了解JDBC是什么&#xff0c;JDBC的全称是Java数…

2018年全国职业技能大赛中职组“网络安全”赛项—基础题(解析)

2018年全国职业技能大赛中职组“网络安全”赛项—基础题&#xff08;解析&#xff09; 任务一、nmap 1、nmap sP -n 192.168.100.133 //进行ping扫描 1.1、nmap -Pn -n 192.168.100.133 //目标禁用 绕过ping 扫描 2、nmap -A -n ip // 对ip进行综合性扫描 3、nmap -O -n…

TiDB-学习笔记

编写这个笔记&#xff0c;希望能记录下学习TiDB时候的知识点。 目录 第一章 1.事务 1.1 SQL-92标准&#xff1a; 1.2 事务的隔离级别 2.在TiDB学习 SQL 语句 第二章 第三章 第一章 1.事务 事务的特性&#xff08;ACID&#xff09; atomicity原子性、consistency一致性、i…

网上花店网页代码 html静态花店网页设计制作 dw静态鲜花网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

全志V853 在 NPU 转换 YOLO V3 模型

NPU 转换 YOLO V3 模型 YOLO 全称是 You Only Look Once&#xff08;你只需看一次&#xff09;&#xff0c;从名称上也能看出这种算法速度快的优势&#xff0c;因此在许多边缘设备上&#xff0c;YOLO 算法的使用十分广泛。YOLOV3 是华盛顿大学研究生 Joseph Redmon 所开发&…

matlab学习笔记(九)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 matlab学习笔记&#xff08;九&#xff09;一、信号采样二、信号重建一、信号采样 信号的采样原理图如下图所示&#xff1a; 其数学模型表示为&#xff1a; 其中的f(t)为原…

11、Mysql高级之SQL优化

11、Mysql高级之SQL优化 文章目录11、Mysql高级之SQL优化0 SQL优化1 大批量插入数据2 优化insert语句3 优化order by语句3.1 环境准备3.2 两种排序方式3.3 Filesort 的优化4 优化group by 语句5 优化嵌套查询6 优化OR条件7 优化分页查询7.1 优化思路一7.2 优化思路二8 使用SQL提…

【Budibase】搭建低代码开发平台

Budibase介绍 Budibase 是一套开源的低代码开发平台&#xff0c;支持一键数据库及API 接入&#xff0c;支持简单的 JS 关联前后端数据&#xff0c;有细致的权限访问管理&#xff0c;对移动端有良好的支持。它主打企业流程自动化&#xff0c;有完善的自动化流程设计&#xff0c…

NETDMIS5.0界面介绍

1.启动界面介绍 双击桌面快捷方式&#xff0c;打开NET.DMISS启动界面如下图&#xff0c;包含三个菜单是文件、设置语言、帮助。 2.工作界面介绍 默认测量界面包括主菜单&#xff0c;工具条&#xff0c;节点程序界面&#xff08;显示测量过程&#xff09;&#xff0c;CAD视窗…

(免费分享)基于ssm简易网盘系统

开发工具&#xff1a;IDEA&#xff0c;mysql5.7 Tomcat8.0&#xff0c;jdk1.8 package cn.tangtj.clouddisk.web;import cn.tangtj.clouddisk.entity.User; import cn.tangtj.clouddisk.utils.UserUtil; import org.apache.logging.log4j.LogManager; import org.apache.loggi…

嵌入式应用开发|Linux文件I/O常用的四种访问方式

在Linux系统中&#xff0c;一切都可以看成"文件"<通常包含&#xff1a;普通文件、驱动文件、网络通信文件等等>&#xff0c;系统中所有的操作都可以通过文件I/O实现&#xff0c;因此&#xff0c;掌握文件常用接口很有必要。 0.前言 屏幕前的你如果懂得main函数…

SAP S4 如何快速配置一家公司

之前配置公司采用的方法是copy的方式来配置&#xff0c;后来在做其他配置的时候发现&#xff0c;copy的方法会把很多不需要的配置也copy进来了。所就我从新定义了一个公司来进行学习研究。配置一定空的公司很简单&#xff0c;只需要三步&#xff1a; 1 定义和分配公司 • 公司…

Java中的异常、IO与NIO面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

萤石网络通过注册:9个月净利2亿同比降28% 海康威视为大股东

雷递网 雷建平 12月19日杭州萤石网络股份有限公司&#xff08;简称&#xff1a;“萤石网络”&#xff09;日前通过注册&#xff0c;准备在科创板上市。萤石网络计划募资37.39亿元&#xff0c;其中&#xff0c;22亿元用于萤石智能制造重庆基地项目&#xff0c;8亿元用于新一代物…

论文投稿指南——中文核心期刊推荐(航空、航天)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

做Python网络爬虫需要掌握哪些核心技术?

在当下这个社会&#xff0c;如何有效地提取并利用信息成为一个巨大的挑战。基于这种巨大的市场需求&#xff0c;爬虫技术应运而生&#xff0c;这也是为什么现在爬虫工程师的岗位需求量日益剧增的原因。那么做Python网络爬虫需要掌握哪些核心技术呢&#xff1f;下面我们来一起看…

机器学习 特征工程及模型聚合

目录 一&#xff1a;什么是特征工程 二&#xff1a;特征工程方法 三&#xff1a;独热编码 四&#xff1a;归一化处理 五&#xff1a;特征工程方法 六&#xff1a;特征工程处理过程 七&#xff1a;Kaggle房价预测实际案例 一&#xff1a;什么是特征工程 1 是最大限度地从…

React源码分析6-hooks源码

本文将讲解 hooks 的执行过程以及常用的 hooks 的源码。 hooks 相关数据结构 要理解 hooks 的执行过程&#xff0c;首先想要大家对 hooks 相关的数据结构有所了解&#xff0c;便于后面大家顺畅地阅读代码。 Hook 每一个 hooks 方法都会生成一个类型为 Hook 的对象&#xff…

学习->C++篇十八:一文总结C++的异常

目录 C为什么要引入异常&#xff1f; 什么是异常&#xff1f; 怎么使用异常处理错误&#xff1f; 异常的抛出规则&#xff1a; 异常的匹配规则&#xff1a; 单个catch语句&#xff0c;不能完全处理掉异常&#xff1f;重新抛出异常 什么是异常安全问题&#xff1f; 什么…

一、绘制折线图

Origin-绘图 一、新建绘图表格 Add New Column&#xff1a;新建一列 Set as→Y Error设置新列为Y误差 Long Name&#xff1a;X轴和Y轴名称&#xff1b;Units&#xff1a;单位&#xff1b;Comments&#xff1a;注释&#xff1b; 二、绘图 绘制折线图&#xff1a; 选择X、Y、…