接口的三个常见使用案例

下面的三个案例,都是需要实现接口,才能进行的操作。

目录

1.比较对象大小

2.给对象排序

3.深浅拷贝


1.比较对象大小

1.1引入

(1)普通类型比较

(2)引入类型比较

发现报错,因为在Java中,引用类型不能直接比较大小,引用类型指向的是对象。在比较的时候,编译器不清楚你要比较对象中的什么内容,所以不允许使用大于小于号来比较引用类型的大小。

所以需要借助一个方法进行比较:comparaTo()

(3)使用comparaTo()比较

 

我们发现,当String类型的引用使用该方法去比较时,是允许的;但是Student类型的引用去比较却是不可以的。说明String类可以使用该方法,那我们下面就去了解该方法

(4)String中的comparaTo方法

我们就可以看到,在String内部,是有这个类的。

然后我们发现,是String类实现了Comparable接口,然后重写了comparaTo方法 

所以String类可以调用comparaTo方法,Student类不行是因为其没有实现该接口。

(5)结论

所以,一个自定义类型(引用类型),需要比较两个对象大小的时候,就需要实现Comparable接口,并且重写comparaTo方法

1.2.实现接口、重写方法

(1)实现接口

报错的原因是没有重写接口中的方法 

(2)重写方法

(3)修改重写方法

按照年龄比较: 

 

返回大于0的数字,说明第一个对象比较大 

按照姓名比较:

返回小于0的数,说明第二个对象比较大

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

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

    @Override
    public int compareTo(Student o) {
        return  this.name.compareTo(o.name);
    }
}
public class Test2 {

    public static void main(String[] args) {
        Student s1 = new Student("张三",19);
        Student s2 = new Student("李四",18);
        System.out.println(s1.compareTo(s2));
    }
}

2.给对象排序

2.1.引入

(1)给一个数组排序

我们可以发现,可以给数组排序,并且还能打印出来。

(2)给自定义类型排序

程序一允许,发现报错了。

原因是:类型转化异常。而且Students类是自定义类型,里面的元素不可比较大小,也就无法完成排序。

做法:和上面一样,需要实现Comparable接口,并且重写comparaTo方法,指定比较的具体对象才行。

2.2.实现接口、重写方法

(1)实现接口

(2)重写方法

(3)自定义比较

(4)排序效果

(5)完整代码

class Students implements Comparable<Students>{
    public String name;
    public int age;

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

    @Override
    public int compareTo(Students o) {
        return this.age - o.age;
    }
}
public class Test3 {
    public static void main(String[] args) {
        Students s1 = new Students("a",17);
        Students s2 = new Students("d",16);
        Students s3 = new Students("b",20);
        Students[] students = {s1,s2,s3};
        Arrays.sort(students);

    }
}

 排序之后是按照年龄从小到大排序。

如果这个时候又想去按照姓名去排序呢?难道是直接修改comparaTo方法吗?那样的话就非常的麻烦和不方便了,所以接下来就介绍一个比较器。

2.3.实现比较器

(1)什么是比较器

比较器,本身是一个单独的类,这个类实现了Comparator接口,并且内部重写了compare方法

(2)举例

1)实现接口

2)重写方法

3)指定年姓名排序

4)简单比较

显而易见,是第二个名字比较大 

(3)使用比较器排序

1)使用Arrays.sort对自定义类型排序,可以看到参数是支持一个比较器的

2)传参

 3)运行结果

排序前:

排序后:

所以说,我们可以自定义比较器,就可以自己选择排序方式;如果是在待排序内部定义,则写死了,如果需要按照其他的方式进行排序,则需要重写写。

3.深浅拷贝

什么叫深拷贝、浅拷贝,其实是代码层面上的一种实现方式。拷贝也称为克隆,就是将对象多复制出来一份,复制后的对象是一个独立的空间,和旧的对象完全独立,只是内容一样。

3.1.浅拷贝

浅拷贝就是普通的对象克隆,在这里介绍什么是对象克隆,和怎么样去克隆对象。

(1)克隆普通对象

1)对该类的对象进行克隆

下面是克隆的语法。让对象调用克隆方法即可,但是下面报错了。 

报错的原因:因为父类的clone方法是被保护起来的,在不同包中去访问,需要通过sper关键字去访问。

解决方法:在Data类中重写该方法

但是仍然报错,但是报错原因不一样,现在的原因是:父类当中的方法是声明了异常,而这里没有,所以解决方法就是统一格式:

上述没有报错,程序运行后:

抛了个异常,显示克隆异常,什么原因呢?原因就是这个类不支持克隆,解决方法:需要实现克隆接口:

克隆后:

普通类克隆的总结:

3.2.深拷贝

(1)引入

下面是两个类,通过组合的方式进行组织 

克隆后:

上述的效果不明显,我们通过代码层面观察。

运行结果:

我们发现,通过克隆后的对象去修改,最终原对象中的值也被修改了,这很不符合克隆的要求。例如,A羊复制出B羊,此时有两个羊;然后将克隆羊B的一条腿砍了,A羊此时的一条腿也会跟着没,这是不符合的,因此这种称为浅拷贝。要想做到深拷贝,需要在代码上进行修改。

(2)浅拷贝对象的内存指向

1)实际指向

下面这种结果,new Son()对象是共享的,通过其中一个对象修改,势必会影响到第二个对象。

2)目标指向

所以要做到上面的效果,就需要去修改代码

(3)实现深拷贝

1)分析原有的克隆方法

2)需要将t1中指向的对象也克隆一份

t1指向的对象要想被克隆,那么它本身也是要支持克隆的

实现深克隆:

3)深拷贝完整代码:

class Son implements Cloneable{
    public int data = 9;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Data implements Cloneable{
    public int data1;
    public int data2;

    public Son data3;
    public Data(int data1, int data2) {
        this.data1 = data1;
        this.data2 = data2;
        data3 = new Son();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //return super.clone();
        Data tmp = (Data) super.clone();//浅拷贝

        tmp.data3 = (Son) this.data3.clone();//克隆对象的对象

        return tmp;
    }
}


public class Test4 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Data t1 = new Data(11,22);
        Data t2 = (Data) t1.clone();


        System.out.println("修改之前:"+t1.data3.data);
        System.out.println("修改之前:"+t2.data3.data);
        t2.data3.data = 999999;//通过克隆得到的对象去修改
        System.out.println("修改之后:"+t1.data3.data);
        System.out.println("修改之后:"+t2.data3.data);

    }
}

运行结果:

4)深拷贝过程分析

第一步:整体克隆(浅拷贝)

第二步: 克隆对象的对象(深拷贝)

第三步:赋值

第四步:返回接收

直至,完成了深拷贝的实现,这样对t2中的data3进行任意修改,都不会影响t1中的。

所以,深拷贝:克隆出一份完全独立对象的对象。也就是要将对象的对象也克隆一份。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何理解Vue 3组件的component关键字

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

新质生产力与智能制造:推动制造业转型升级的双引擎

引言 随着科技的不断进步和全球制造业的快速发展&#xff0c;新质生产力与智能制造成为推动制造业转型升级的关键驱动力。新质生产力强调的是以科技创新和制度创新为核心&#xff0c;通过提高生产效率和经济效益来推动经济发展。而智能制造则是利用现代信息技术&#xff0c;实现…

window2012等显示桌面上面的【我的电脑】图标

服务器版本&#xff0c;登录进去&#xff0c;就留个垃圾桶在桌面上&#xff0c;一点也没有用处。 如何显示经典的“我的电脑”呢。 网络介绍了几种方法都木用。这种还点用&#xff1a; win图标点右键》运行&#xff1a; rundll32.exe shell32.dll,Control_RunDLL desk.cpl,…

【系统分析师】计算机网络

文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术&#xff08…

使用odbc链接dm8数据库

一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中&#xff0c;没有…

【每日刷题】代码随想录-动规32

1. 代码随想录-动规32.LC121买卖股票的最佳时机 题目链接 不用动规。双指针法。快指针遍历&#xff0c;慢指针指向最小的。 max维护最大差值。 min第一天价格&#xff0c;如果碰到有比min低的&#xff0c;则更新min。 代码 public int maxProfit(int[] prices) {int min pr…

国内开通gpt会员方法

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

【WinForm】如何在自己的程序窗口中显示并调用外部桌面程序

当你爱上一个程序的功能&#xff0c;并且希望扩展它以满足自己的需求时&#xff0c;你可能会觉得困惑。毕竟&#xff0c;你已经为此付出了很多努力&#xff0c;并希望能够有效地整合这些功能。那么&#xff0c;是否可以将这些功能嵌套到自己的程序中呢&#xff1f; 首先&#…

三年了,期待下一个三年

第一个三年 时间好快&#xff0c;距离我发布我第一篇文章都已经三个年头了。 转眼也从大一新生变成了大四打工人。 在平台上发布博客&#xff0c;分享自己的项目、学习思路、解决的bug都带给我很多收获。 平台上的粉丝&#xff0c;阅读量等&#xff0c;也让我的简历更加出彩。…

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入&#xff0c;为了降低学习成本&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;快速进入二…

【MATLAB应用】去噪算法

01.引言 图像的产生是电子和光学相互作用的结果&#xff0c;而图像中的噪声则是由于成像过程中的颗粒性质而客观存在的。不同类型的噪声从不同的视角产生&#xff0c;各自具有特点。因此&#xff0c;有效地去除图像中的噪声以获得更高质量的图像具有实际意义。目前存在多种图像…

IPD集成产品开发

时间&#xff1a;2024年04月14日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 解密IPD集成产品开发_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅欢迎收听小蒋聊技术的类最新章节声音“解密IPD集成产品开发”。大家好&#xff…

MAT工具详解

简介 Java自带的JVisualVm可以用来分析Java堆内存&#xff0c;可以用来排查内存泄漏和内存浪费的问题&#xff0c;但是功能不是特别强大&#xff0c; MAT&#xff08;Memory Aanlysis Tool&#xff09;是一款更优的工具。 MAT功能 功能组 全局信息 直方图 按照类的数量倒序…

AI大模型日报#0413:谷歌引入“无限注意力”、Picsart AI 开源120秒超长AI视频模型

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 速递&#xff5c;木头姐 ARK 宣布已投资 OpenAI&#xff01;还将 Anthropic 及 Figure1 等 AI 独角兽一网打尽摘要: ARK已通过其风…

Zookeeper和Kafka的部署

目录 一、Zookeeper的基本概念 1. Zookeeper定义 2. Zookeeper工作机制 3. Zookeeper特点 4. Zookeeper数据结构 5. Zookeeper应用场景 5.1 统一命名服务 5.2 统一配置管理 5.3 统一集群管理 5.4 服务器动态上下线 5.5 软负载均衡 6. Zookeeper 选举机制 6.1 第一…

MySQL——链表

主键&#xff1a;非空 唯一&#xff08;针对整列数据而言&#xff09; 为了方便管理一般主键都是设置为自增 外键&#xff1a;一张表中的一列的值是另一张表的主键&#xff0c;使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式&#xff1a;s…

kali桥接校园网实现上网

1.查看校园网信息 1. vim /etc/network/interfaces 添加下列信息&#xff0c;地址、网关、掩码和主机一样即可 3.vim /etc/resolv.conf 添加dns解析 4.macchanger -m AA:bb:cc:DD:ee:ff eth0(改为和主机一样的mac) 5. /etc/init.d/networking restart 重启网络即可

【Python函数和类4/6】递归与匿名函数

目录 目标 匿名函数 多个形参 匿名函数的局限性 递归 语言例子 数学例子 递归的实现 递归代码 练习 总结 目标 在之前的博客中&#xff0c;我们学习了定义函数、调用函数以及设置函数的参数。在今天&#xff0c;我们会补充函数的两个常见的知识点&#xff0c;一个是匿…

【Linux】安装及管理程序

目录 一、Linux应用程序基础 1.应用程序与系统命令 2.典型应用程序的目录结构 3.软件包封装类型 二、RPM 1.RPM 软件包管理器 2.RPM软件包命名格式 3.RPM命令的格式 4.查询已安装的rpm软件信息 5.查询未安装的 RPM 软件包文件中信息 6.安装、升级、卸载 RPM 软件包 …

gitlab:Could not resolve host

fatal: unable to access http://xxx.git/: Could not resolve host: yyy Git-fatal: unable to access ‘https://gitlab.XX.git/‘: Could not resolve host: gitlab.XX.com.cn_drone unable to access .git/: could-CSDN博客 原因&#xff1a; 克隆的时候使用的是这里的HTT…