“努力是人生的一种精神状态,往往最美的不是成功的那一刻,而是那段努力奋斗的过程。”

1.前言

本文为大家带来接口进阶方法的深度学习,包含Java中自带的接口,以及如何使用跟进小编的脚步哦!

2.正文

1. Comparable接口(小特殊)

  • 1.1 什么是Comparable接口?

    当我们要比较两个对象的内部大小时,我们只学了equal()方法,而返回值是boolean类型,Comparable接口是Java中默认的接口,可以调用compareTo()方法来比较两个对象的大小,返回值是整型。
  • 1.2 如何使用Comparable接口?

在这里插入图片描述

Comparable后是泛型的表达式,在数据结构小编会仔细说,比较哪个对象泛型里就放那个对象,在实现这个接口的同时要重写compareTo()方法!!这个可以由编译器自己生成,return的值根据想比较的数值进行修改。


在这里插入图片描述
由编译器生成的结果来看,compareTo方法返回值是整型。我们可能会有个疑问,conpareTo方法中return的this 是谁的this?谁调用了compareTo这个方法谁就是this,
这里与我们类与对象的知识相串联,可以看小编类与对象的博客。这里dog1调用的方法this是dog1的this。


  • 1.3 多个对象实现比较

    首先我们思考当有多个对象应该如何将他们放在统一的标准比较呢?这时我们就要用到了数组,把对象都存到数组里就解决了问题!
    在这里插入图片描述
    在这里插入图片描述
    我们可以看到Arrays.sort()方法仍然对排序有效!!这是为什么呢?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
当我们屏蔽掉Comparable接口以及方法是发现报错了!!!报了一个类型转换的错误这是为什么???


在这里插入图片描述
这是第320行的代码,在这一行我们可以看到将一个数组强转成Comparable型,并调用compareTo方法,这就是为什么在Arrays.sort排序中涉及到类型转换的报错,所以我们必须实现Comparable接口和方法


  • 1.4 Compareable接口的缺陷

    这个比较方式用于固定的比较,不能灵活的比较,所以我们引出下面更方便的一个接口的介绍


2. Comparator接口

  • 2.1 什么是Comparator接口?

    与Comparable接口类似,实现了对象的比较,但更加的自由,是pro版

  • 2.2 如何使用Comparator接口?

d1a4c198e65784161942c03.png)
在这里插入图片描述
这里注意一下字符串是不能比较大小的!!Comparator接口里也实现了自己的compareTo方法所以我们再调用compareTo方法去比较字符串
在这里插入图片描述
这样我们就成功的比较了dog1 dog2的年龄,当我们要比较其他时也非常的自由!


3. Cloneable接口

  • 3.1 什么是Cloneable接口

    Cloneable接口主要用来克隆一个对象,让一个新的引用指向克隆出来的对象


  • 3.2 如何使用Cloneable接口

在这里插入图片描述
这里看我们已经实现了这个接口为什么还会报错,调用不了这个方法?


在这里插入图片描述
clone方法是Object的方法,我们知道Object类是所有类的父类,我们不能通过子类对象的引用直接访问父类的方法,所以我们重写了这个方法!!但是为什么还报错?


在这里插入图片描述
在我们实现这个Cloneable接口时,我们必须先创造一个空接口,空接口也叫标记接口的作用是表示当前类是可以被克隆的!!那为什么还报错?


在这里插入图片描述
这样代码就不报错了,首先我们处理向下转型,因为返回值是Object类型,我们要强制类型转换成Dog类型,其次我们也要在方法前声明这个报错throws出来,(后续小编会讲)最后才真正意义上实现了这个接口!!


在这里插入图片描述这是小编画的图有助于更好的理解


  • 3.4 二次克隆

在这里插入图片描述
新建一个类Fun,在Dog类里声明一个新的成员变量


在这里插入图片描述我们可见dog2.fun。add修改成了999,而dog1.fun.add也变成999,这说明是克隆了Dog对象,没有克隆Fun对象,我们画一个图更好理解一下

在这里插入图片描述
这种拷贝方式我们又称作浅拷贝,add是共有的!!


4. 深拷贝与浅拷贝

  • 4.1 什么是深拷贝和浅拷贝?

    浅拷贝上述已经是说了,而深拷贝就是新克隆了一个fun对象,在新克隆的对象用dog2.fun.add进行修改

  • 4.2 深拷贝是什么样的?

在这里插入图片描述
先在Fun类实现Cloneable接口并重写clone方法,那么什么时候调用这个方法呢?


在这里插入图片描述
我们知道return super.clone()实现克隆,这里我们在Dog类新定义一个tmp ,tmp接收dog1克隆,tmp中的fun也克隆出一份fun出来,这里画图解释一下
在这里插入图片描述
这就是进行了一次深拷贝!!


在这里插入图片描述
最够运行出来的结果如上!

注意一点:深拷贝和浅拷贝都是根据代码实现的而不是说什么方法是深拷贝还是浅拷贝

3.结语

以上是今天小编为大家带来的接口进阶,有不明白的地方可以留言小编会回复,希望读者们多提建议,小编会改正,共同进步!谢谢大家。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐