Java-抽象类和接口(下)


接口使用实例
给对象数组排序
两个学生对象的大小关系怎么确定? 需要我们额外指定.
这里需要用到Comparable 接口
在这里插入图片描述
在Comparable 接口内部有一个compareTo 的方法,我们需要实现它
在这里插入图片描述
在下图中,我们需要将o强制转换为Student
在这里插入图片描述
之后调用Arrays.sort(array)即可完成排序,如下
在这里插入图片描述
代码:

package demo5;import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-08-16* Time: 16:40*/
class Student implements Comparable{public String name;public double score;public Student(String name,double score){this.name=name;this.score=score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score='" + score + '\'' +'}';}public int compareTo(Object o) {Student student=(Student)o;if(this.score>student.score){return 1;}else if(this.score<student.score){return -1;}return 0;}
}
public class Test {public static void main(String[] args) {Student[] array=new Student[3];array[0]=new Student("zhangsan",80);array[1]=new Student("qwer",7);array[2]=new Student("asdfg",806);System.out.println("前"+ Arrays.toString(array));Arrays.sort(array);System.out.println("后"+ Arrays.toString(array));}
}

为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)
在这里插入图片描述
结果也是正确的
在这里插入图片描述


扩展上面的内容,我们想分别按照年龄和分数排序
需要用到Comparator接口
在这里插入图片描述
建立两个不同的类来实现这两种方法,都要实现Comparator接口
在这里插入图片描述
结果如下
在这里插入图片描述
上述代码如下:

package demo5;import java.util.Arrays;
import java.util.Comparator;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-08-16* Time: 16:40*/
class Student{public String name;public double score;public int age;public Student(String name,double score,int age){this.name=name;this.score=score;this.age=age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score='" + score + '\'' +'}';}
}
class AgeComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.age-o2.age;}
}
class ScoreComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return (int)(o1.score-o2.score);}
}
public class Test {public static void main(String[] args) {Student[] array=new Student[3];array[0]=new Student("zhangsan",80,89);array[1]=new Student("qwer",7,123);AgeComparator ageComparator=new AgeComparator();System.out.println(ageComparator.compare(array[0], array[1]));System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");ScoreComparator scoreComparator=new ScoreComparator();System.out.println(scoreComparator.compare(array[0], array[1]));}
}

抽象类和接口的区别
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中
不能包含普通方法, 子类必须重写所有的抽象方法.
抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类.
万一不小心创建了 Animal 的实例, 编译器会及时提醒我们.
在这里插入图片描述


Clonable 接口和深浅拷贝
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要
先实现 Clonable 接口
如下所示,我们需要Student实现这个接口,需要对clone方法重写
在这里插入图片描述
但是我们运行后发现还是报错
我们发现这里,点击添加Add
在这里插入图片描述
运行发现继续报错,观察到红线这里,需要的类型为Student,我们提供的类型为Object,需要强制类型转换
在这里插入图片描述
运行,拷贝成功
在这里插入图片描述
上述为浅拷贝


在这里插入图片描述
在这里插入图片描述
结果并不理想,它把两个对象里的grade都改了,这种情况下没有构成深拷贝,拷贝的是grade的地址,它只是对Student对象中的内容进行了一份拷贝,但是并没有对,对象中的对象中的内容进行拷贝。
如何进行深拷贝?
我们改动以下部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


Object类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父
类。即所有类的对象都可以使用Object的引用进行接收。

使用Object接收所有类的对象
在这里插入图片描述


Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法
我们主要来熟悉这几个方法:toString()方法,equals()方法,hashcode()方法


Object类中的toString()方法实现,可以直接用编译器生成重写
在这里插入图片描述


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


hashcode方法
算出一个具体的对象位置
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例
代码:
在这里插入图片描述
像重写equals方法一样,我们也可以重写hashcode()方法。
在这里插入图片描述
在这里插入图片描述


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

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

相关文章

恢复NuGet包_解决:System.BadImageFormatException:无法加载文件或程序集

C#工程 主要是开发了一个 web api接口&#xff0c;这个工程源码去年还可以的&#xff0c;今年换了一个电脑打开工程就报错。 错误提示如下&#xff1a; 在 Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(String[] args) Test1 System.BadImageFormatEx…

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…

线上售楼vr全景看房成为企业数字化营销工具

在房地产业中&#xff0c;VR全景拍摄为买家提供了虚拟看房的全新体验。买家可以通过相关设备&#xff0c;远程参观各个楼盘的样板间和实景&#xff0c;感受房屋的空间布局和环境氛围&#xff0c;极大地提高了购房决策的准确性。对于房地产开发商和中介机构来说&#xff0c;VR全…

docker的安装与基础使用

一.docker简介 1&#xff09;什么是docker Docker是一种用于构建、打包和运行应用程序的开源平台。它基于操作系统级虚拟化技术&#xff0c;可以将应用程序和其依赖的库、环境等资源打包到一个可移植的容器中&#xff0c;形成一个轻量级、独立的可执行单元。 开发者在本地编…

Rabbitmq的应用场景

Rabbitmq的应用场景 一、异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式 ​​串行方式​​: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有…

小程序商品如何指定打印机

有些商家&#xff0c;可能有多个仓库。不同的仓库&#xff0c;存放不同的商品。当客户下单时&#xff0c;小程序如何自动按照仓库拆分订单&#xff0c;如何让打印机自动打印对应仓库的订单呢&#xff1f;下面就来介绍一下吧。 1. 设置订单分发模式。进入管理员后台&#xff0c…

数学建模之“TOPSIS数学模型”原理和代码详解

一、简介 TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;是一种多准则决策分析方法&#xff0c;用于解决多个候选方案之间的排序和选择问题。它基于一种数学模型&#xff0c;通过比较每个候选方案与理想解和负理想解之间的相…

AI百度文心一言大语言模型接入使用(中国版ChatGPT)

百度文心一言接入使用&#xff08;中国版ChatGPT&#xff09; 一、百度文心一言API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API 基于百度文心一言语言大模型…

53 个 CSS 特效 1

53 个 CSS 特效 1 预计是会跟着教程做完 53 个小项目10 个大型的 Responsive 项目&#xff0c;预览地址在http://www.goldenaarcher.com/html-css-js-proj/&#xff0c;git 地址&#xff1a;https://github.com/GoldenaArcher/html-css-js-proj 实用性有加备注&#xff0c;可…

手撕vector容器

一、vector容器的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素&#xff0c;但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自动处理。 总结&#xff1a;vector是一个动态…

【数据结构】顺序队列模拟实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

高效解决Anaconda Prompt报错Did not find VSINSTALLDIR这类问题

文章目录 回忆问题解决问题step1step2 回忆问题 类似于划红线部分然后还有很多行的报错信息&#xff0c;最后一行肯定是红色划线部分 解决问题 step1 找到 D:\Anaconda\envs\pytorch\etc\conda\activate.d在这个文件夹内会有两个文件&#xff0c;删除 vs2017_compiler_v…

B-树和B+树的区别

B-树和B树的区别 一、B-tree数据存储 在下图中 P 代表的是指针&#xff0c;指向的是下一个磁盘块。在第一个节点中的 16、24 就是代表我们的 key 值是什么。date 就是这个 key 值对应的这一行记录是什么。 假设寻找 key 为 33 的这条记录&#xff0c;33 在 16 和 34 中间&am…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

网盘传文件限速严重,来试试ssh内网穿透创建的公网到本地http服务器吧

title: 网盘传文件限速严重&#xff0c;来试试ssh内网穿透创建的公网到本地http服务器吧 如果你被国内某度网盘的火星传输速度折磨&#xff0c;可以搞一个固定IP的服务器&#xff0c;传输文件会变得简单&#xff0c;通过ssh转发&#xff0c;我们可以让接受者通过浏览器直接下载…

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机&#xff0c;它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例&#xff0c;负载均衡器在接收到第一个来…

Servlet 初步学习

文章目录 Servlet1 简介2 快速入门3 执行流程4 生命周期5 方法介绍6 体系结构7 urlPattern配置8 XML配置 Servlet 1 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门 动态 web资源开发技术。 使用Servlet就可以实现&#xff0c;根据不同的登录用户在页面…

JVM学习笔记(一)

1. JVM快速入门 从面试开始&#xff1a; 请谈谈你对JVM 的理解&#xff1f;java8 的虚拟机有什么更新&#xff1f; 什么是OOM &#xff1f;什么是StackOverflowError&#xff1f;有哪些方法分析&#xff1f; JVM 的常用参数调优你知道哪些&#xff1f; 内存快照抓取和MAT分…

React(6)

1.React插槽 import React, { Component } from react import Child from ./compoent/Childexport default class App extends Component {render() {return (<div><Child><div>App下的div</div></Child></div>)} }import React, { Compon…

菜单中的类似iOS中开关的样式

背景是我们有需求&#xff0c;做类似ios中开关的按钮。github上有一些开源项目&#xff0c;比如 SwitchButton&#xff0c; 但是这个项目中提供了很多选项&#xff0c;并且实际使用中会出现一些奇怪的问题。 我调整了下代码&#xff0c;把无关的功能都给删了&#xff0c;保留核…