【JavaSE】接口 详解(下)

前言

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

接口实例运用

代码举例理解

比较对象的年龄

比较对象的姓名

利用冒泡排序实现Array.sort

年龄比较器

姓名比较器

比较示例测试

clone接口

浅拷贝和深拷贝

浅拷贝

图解

代码举例

深拷贝

图解

代码举例


接口实例运用

接口实现比较引用数据类型(对于引用类型数据来说,不能直接用大于小于号来比较)

代码举例理解

这里要比较两个对象的大小(指定某种方式比较,比如 年龄等)

比较对象的年龄

package demo6;//接口Comparable 实现 比较引用类型数据的方法,这里面的comparable 的compareTo需要重写
class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Override//要重写这个方法public int compareTo(Student o) {/*    if(this.age>o.age){//this表示当前对象,o表示传的参数return 1;}else if(this.age<o.age){return 0;}else{return -1;}*///代码改良return this.age-o.age;}
}public class Test6 {public static void main(String[] args) {Student student1=new Student("zhangsan",20);Student student2=new Student("lisi",5);
//        比较student1和student2,如果1大于2,返回大于0的数字,否则返回小于0的数字if(student1.compareTo(student2)>0){//调用的是student1的比较方法,传的是参数是student2System.out.println("student1>student2");}else{System.out.println("student1<=student2");}}
}

测试结果

比较对象的姓名

name是String类型,Java里面自带了字符串比较方法compareTo,比较的是字符串的ASCII码值

        @Override//要重写这个方法public int compareTo(Student o) {if(this.name.compareTo(o.name)>0){//this表示当前对象,o表示传的参数return 1;}else if(this.name.compareTo(o.name)==0){return 0;}else{return -1;}

这里有问题:Comparable接口有局限性(一旦这个类写死了比较方式,就不能随意更改)

利用冒泡排序实现Array.sort

public class Test6 {//冒泡排序 模拟实现引用数据类型的排序public static void mySort(Comparable[] comparable){for (int i = 0; i < comparable.length-1; i++) {for (int j = 0; j < comparable.length-1-i; j++) {if(comparable[j].compareTo(comparable[j+1])>0){//交换Comparable tmp=comparable[j];comparable[j]=comparable[j+1];comparable[j+1]=tmp;}}}}public static void main(String[] args) {Student[] students=new Student[3];students[0]=new Student("zhangsan",8);students[1]=new Student("lisi",4);students[2]=new Student("wangwu",10);mySort(students);System.out.println(Arrays.toString(students));}}

代码结果(这里是根据学生的年龄排的结果)

年龄比较器

package demo;import java.util.Comparator;public class AgeComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.age-o2.age;}
}

姓名比较器

package demo;import java.util.Comparator;public class NameComparator implements Comparator<Student> {@Overridepublic int compare(Student o1,Student o2) {return o1.name.compareTo(o2.name);}
}

比较示例测试

public class Test {public static void main(String[] args) {Student student1=new Student("zhangsan",4);Student student2=new Student("lisi",6);//年龄比较器AgeComparator ageComparator=new AgeComparator();int ret=ageComparator.compare(student1,student2);System.out.println(ret);//名字比较器NameComparator nameComparator=new NameComparator();int ret2=nameComparator.compare(student1,student2);System.out.println(ret2);}

clone接口

前提:任何一个对象默认都是继承Object类的(是所有类的父类)

package demo3;class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问}
}public class Test {public static void main(String[] args)  throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)}
}

浅拷贝和深拷贝

浅拷贝

两个引用指向一个对象,如两个Student指向一个Money

图解

代码举例

package demo3;class Money {public double money=12.5;
}class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Money m=new Money();public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问}
}public class Test {public static void main(String[] args)  throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)System.out.println(student1.m.money);//12.5System.out.println(student2.m.money);//12.5System.out.println("============");student2.m.money=100;System.out.println(student1.m.money);System.out.println(student2.m.money);}
}

打印结果

这里通过对象student2修改了money,而student1的money也被修改了

深拷贝

两个引用指向两个对象,如两个Student指向两个个Money

图解

代码举例

package demo3;class Money implements Cloneable{//表示Money支持克隆功能public double money=12.5;@Overrideprotected Object clone() throws CloneNotSupportedException {//要重写克隆方法return super.clone();}
}class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Money m=new Money();public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {Student tmp=(Student)super.clone();tmp.m=(Money)this.m.clone();return tmp;}
}public class Test {public static void main(String[] args)  throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)System.out.println(student1.m.money);//12.5System.out.println(student2.m.money);//12.5System.out.println("============");student2.m.money=100;System.out.println(student1.m.money);System.out.println(student2.m.money);}
}

打印结果

这里通过对象student2修改了money,student1的money不会被修改。

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

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

相关文章

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

系统架构最佳实践 -- 智慧图书管理系统架构设计

随着数字化时代的到来&#xff0c;智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求&#xff0c;还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现&#xff0c;以满足…

Debian安装1panel管理面板教程-最新

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1Panel面板是一个强大的服务器管理工具&#xff0c;它通过提供一站式管理、易于使用的界面、高度的可定制性、安全可靠的性能、强大的扩展性以及活跃的社区支持&#xff0c;为用户提供了一个高效、便捷的管理解决方案…

test4101

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

featup入坑笔记

一、新建环境 在conda中建立一个虚拟环境featup&#xff0c; conda create -n featup python3.9 二、开始配置&#xff1a; 我是先下载了FeatUp&#xff0c;之后 pip install -e . -i https://mirrors.aliyun.com/pypi/simple/ 但是&#xff0c;突然出错了&#xff0c;说无法…

记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time

记Kubernetes&#xff08;k8s&#xff09;&#xff1a;访问 Prometheus UI界面:Warning: Error fetching server time 1、报错详情2、解决3、再次访问 PrometheusUI界面 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、报错详情 Warning:…

软件杯 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

视频插针调研

视频插针 1、评估指标2、准确度3、实时4、视频流处理3、实时RIFE视频插帧测试 1、评估指标 参考&#xff1a;https://blog.csdn.net/weixin_43478836/article/details/104159648 https://blog.csdn.net/weixin_43605641/article/details/118088814 PSNR和SSIM PSNR数值越大表…

Opencv驱动摄像头

Opencv驱动摄像头&#xff0c;此段代码只能驱动电脑自带摄像头&#xff0c;目前没有分析出为何不能驱动另外连接的相机&#xff01; #include<iostream> #include<opencv2\core.hpp> #include<opencv2\highgui.hpp> #include<opencv2\imgproc.hpp> #i…

ubuntu下NTFS分区无法访问挂载-解决办法!

Ubuntu系统下&#xff0c;有的时候发现&#xff0c;挂载的NTFS文件系统硬盘无法访问。点击弹出类似问题&#xff1a; Error mounting /dev/sda1 at /media/root/新加卷: Command-line mount -t "ntfs" -o "uhelperudisks2,nodev,nosuid,uid0,gid0" "/…

【攻防世界】mfw(.git文件泄露)

首先进入题目环境&#xff0c;检查页面、页面源代码、以及URL&#xff1a; 发现页面无异常。 使用 dirsearch 扫描网站&#xff0c;检查是否存在可访问的文件或者文件泄露&#xff1a; 发现 可访问界面/templates/ 以及 .git文件泄露&#xff0c;故使用 GItHack 来查看泄露的 …

状态模式(行为型)

目录 一、前言 二、状态模式 三、总结 一、前言 状态模式(State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类&#xff0c;但实际上&#xff0c;由于状态模式的引入&#xff0c;行为的变…

Python单元测试pytest捕获日志输出

使用pytest进行单元测试时&#xff0c;遇到了需要测试日志输出的情况&#xff0c;查看了文档 https://docs.pytest.org/en/latest/how-to/capture-stdout-stderr.html https://docs.pytest.org/en/latest/how-to/logging.html 然后试了一下&#xff0c;捕捉logger.info可以用…

大语言模型及提示工程在日志分析任务中的应用 | 顶会IWQoS23 ICPC24论文分享

本文是根据华为技术专家陶仕敏先生在2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会闪电论文分享环节上的演讲整理成文。 BigLog&#xff1a;面向统一日志表示的无监督大规模预训练方法 BigLog: Unsupervised Large-scale Pre-training for a Unified Log Represen…

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装 测试结果 说明 这是根据我的需求写的&#xff0c;所以有些参数是写死的&#xff0c;比如cpu核数和内存&#xff0c;你可以根据你的需要自行修改。前置条件&#xff1a; 当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户 依赖安…

RocketMQ之Topic和Tag最佳实践

一、Topic是什么&#xff1f;它的作用&#xff1f; Topic即主题&#xff0c;是消息队列中用于对消息进行分类和组织的一种机制&#xff0c;它有以下三种作用&#xff1a; 标识消息分类&#xff1a;RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题…

Python八股文:基础知识Part1

1. 不用中间变量交换 a 和 b 这是python非常方便的一个功能可以这样直接交换两个值 2. 可变数据类型字典在for 循环中进行修改 这道题在这里就是让我们去回答输出的内容&#xff0c;这里看似我们是在for循环中每一次加入了都在list中加入了一个字典&#xff0c;然后字典的键值…

本地项目提交 Github

工具 GitIdeaGithub 账号 步骤 使用注册好的 Github 账号&#xff0c;登陆 Github&#xff1b; 创建 Repositories (存储库)&#xff0c;注意填写图上的红框标注&#xff1b; 创建完成之后&#xff0c;找到存储库的 ssh 地址或 https 地址&#xff0c;这取决于你自己的配置…

TiDB 组件 GC 原理及常见问题

本文详细介绍了 TiDB 的 Garbage Collection&#xff08;GC&#xff09;机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB&#xff0c;并通过 MVCC 机制&#xff0c;基于 RocksDB 实现了分布式存储引擎 TiKV&#xff0c;以支持高可用分…