ObjectOrientedProgramming - 面向对象的编程(三个常用接口)- Java - 细节狂魔

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

*   *   [总结:](about:blank#_116)
  • 因为Comparable 的缺陷,很dan疼,所以 Comparator 接口(别称 比较器) 出世了。

    • 来着跟着我的思路来一步步来看
  • Cloneable 接口

    • 在了解cloneable接口之前,先来了解创建对象的方式

      • 1. new 关键字

        • 附图
      • 2.克隆

    • 我们通过 clone方法,了解到了Cloneable接口,是与 clone搭配使用的。

      • 最终代码如下:

        • 附图

        • 效果图

    • 拓展一

    • 拓展二

      • 程序如下

        • 附图

        • 最终 程序

  • 本文至此结束

三个常用接口

=====================================================================

1. Comparable

2. Comparator

3. cloneable


Comparable 接口

============================================================================

在了解之前,我们回顾一下数组是怎么排序


代码如下


import java.util.Arrays;



public class Test {

    public static void main(String[] args) {

        int[] array = {1,21,3,14,5,16};

        System.out.println(Arrays.toString(array));

        Arrays.sort(array);

        System.out.println(Arrays.toString(array));

    }

}



效果图

在这里插入图片描述


再来写一个复杂的数组排序



import java.util.Arrays;



class Student{

    public int age;

    public String name;

    public double score;



    public Student(int age, String name, double score) {

        this.age = age;

        this.name = name;

        this.score = score;

    }



    @Override

    public String toString() {

        return "student{" +

                "age=" + age +

                ", name='" + name + '\'' +

                ", score=" + score +

                '}';

    }

}



public class Test {

    public static void main(String[] args) {

        Student[] students = new Student[3];

        students[0] = new Student(18,"小明",80.5);

        students[1] = new Student(16,"小红",96.8);

        students[2] = new Student(19,"小刚",81.5);

        System.out.println(Arrays.toString(students));

        Arrays.sort(students);

        System.out.println(Arrays.toString(students));

    }

}



效果图

在这里插入图片描述


原因附图

进入sort

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

说白了,就是让每个元素都去调用 Comparable。Comparable就是 数组按照某个规律去排序。


既然知道了,为什么不能排序的问题所在,那么我们现在应该思考的是如何让告诉sort,以什么去排序数组,来接着看。


先让 student 类 实现了 Comparable 接口

在这里插入图片描述

点进 Comparable

在这里插入图片描述

再我们程序上 Comparable 接口后面加上 尖括号,里面写 Student,意为 比较学生

在这里插入图片描述


再来观察一下,接口 Comparable 里还有什么东西、

在这里插入图片描述

在这里插入图片描述


compareTo 方法是用来比较数组,那就需要看比较 结果是大于0,还是等于0,再者小于0.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

student调用 compareTo方法,所以 compareTo中的this,指的是 student。

即:this.age == student.age , 而 o.age == student2.age.

compareTo 按照 两者的年龄大小去比较。

最后通过 swap方法交换位置

在这里插入图片描述


再一次执行那个复杂一点的数组排序

在这里插入图片描述


其实 compareTo 方法还可以简化

在这里插入图片描述


由上得知 Arrays.sort();默认排序规律是升序(从小到大),那么逆序怎么实现呢?(交换 this.age 与 o.age的位置就可以了)


在这里插入图片描述


总结:

如果 自定义的数据类型,要进行大小的比较’ 一定要实现可以比较的接口Comparable。


但是 Comparable 接口存在着缺陷: 如果我们要以学生的分数或者名字来排序,就需要重新 把 compareTo 方法的实现重写一遍,

在这里插入图片描述


如果某一天有个朋友抽风了,觉得你用年龄排序不合适,把你的 compareTo 给改了,改成了分数排序。

有的人觉得没问题,但是你有没有想过,这会影响到你后面实现的代码实现逻辑。

在这里插入图片描述


那么通过名字去排序,要怎么写。

在这里插入图片描述

由此不难想出,引用之间的比较,肯定是要通过合适的比较方法的, 那么我们就需要去看 String了。

在这里插入图片描述

你会发现 String,也实现了 Comparable 接口

在这里插入图片描述

我们 art + 7

在这里插入图片描述

那么,如果我们想通过名字排序,就需要compareTo 方法去比较。

在这里插入图片描述


Comparable这个接口,有一个非常大的缺点:对类的侵入性非常强,一旦写好,不敢轻易动。

一动,又不会报错,全班人马像是无头苍蝇一样,想想就觉得不能动,不敢动。


因为Comparable 的缺陷,很dan疼,所以 Comparator 接口(别称 比较器) 出世了。

===================================================================================================================

来着跟着我的思路来一步步来看


回到最初的情况, 数组无法排序

在这里插入图片描述

先进入sort(Ctrl+左键)

在这里插入图片描述

你会发现sort 有很多的排序规则

在这里插入图片描述


现在 我们来创建一个类,该类实现了Comparator接口

Ctrl+左键 进入 Comparator 接口

在这里插入图片描述

在这里插入图片描述


创建一个类来实现 Comparator 接口,并重写当中唯一的抽象方法

在这里插入图片描述

输出原理,跟前面讲的,是一样的, 大于就返回一个非零数字,等于返回0,小于返回负数

在这里插入图片描述

由此可以判断出 我们 Comparator接口(比较器)就完成了。

完成了,就要使用。

在这里插入图片描述

这时,我们再点进sort。

在这里插入图片描述

此时的 Aarrays,sort 就会根据 Comparator 接口(比较器)的规则,进行排序。

在这里插入图片描述

如果,你们说:我们想用分数来排序。(创建分数比较器就可以了)

在这里插入图片描述

名字排序也差不多。

在这里插入图片描述

有的朋友会说,这根Comparable 有什么区别,实现方式都是一样的。

有区别!!!

Comparable 通过一个类去实现的,是定死了的。不能乱改。

而Comparator,是创建一个类 实现它接口的功能。意味着Comparator 不局限与一个类。

它可以根据 不同比较规则 来创建不同的类来实现。

想用哪种规则去排序,就去调用相对应的类。

即使 有人改了其中规则,也只影响调用此规则的数据,

调用其他规则的数据,则不受影响。

优点:

1.排查效率高

2.代码侵入性低(牵连范围小多了)

3.灵活


Cloneable 接口

===========================================================================

在了解cloneable接口之前,先来了解创建对象的方式


1. new 关键字


class Person{

    public int age;

    public void eat(){

        System.out.println("睡");

    }



    @Override

    public String toString() {

        return super.toString();

    }

}



public class Test {

    public static void main(String[] args) {

        // 通常创建对象,是通过new

       Person person = new Person();



    }

}



附图

在这里插入图片描述

2.克隆

比如说:上面的程序中,我想 克隆 一个 person 对象。

这里就要使用 调用 clone() 方法

在这里插入图片描述

那我们就抛出一个异常。快捷键 ALT + ENTER,我们发现

在这里插入图片描述

为了搞清楚原因: Ctrl + 左键点击clone方法,进入clone方法。

在这里插入图片描述

由图得知了 clone方法,是 一个Object的克隆方法,意味着该方法的返回值 是一个Object的类型,那么我们将其类型强转成Person类型

在这里插入图片描述

继续 点击 clone ,ALT + ENTER

在这里插入图片描述

点击 警告

在这里插入图片描述

一看无数眼睛中透露着,这是要干什么?感觉就是不让我们去使用 clone方法。

其实最主要的原因是:一个对象要克隆,产生一个副本,那么这个对象,一定是可克隆的。所以我们必须给 Person 类 实现一个 Cloneable的接口。

在这里插入图片描述

为了,搞明白 Person类,在没有重写 Cloneable 接口的抽象方法情况下,为什么不报错。我们点击进入Cloneable接口中

在这里插入图片描述

在这里插入图片描述

因为 Cloneable 是空的,由此引出一个面试问题: 你知道 Cloneable 接口吗?

你说: 知道。

面试官: 你知道为什么这个接口是一个空接口?

你: 没有为什么,这是一个默认的规则

面试官:有什么作用?

你:如果一个接口是空接口,这时有一个类实现了这个空接口,那么这个空接口,又被称为标志接口,代表当前这个类可以被克隆的。

但是有问题! 我们的clone 还是使用不了

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

image.png

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

[外链图片转存中…(img-IXnIhZ5M-1713567633063)]

后端JAVA面试大全

  • 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

[外链图片转存中…(img-QZy1X3un-1713567633064)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

  • 第三份是Spring全家桶资料

[外链图片转存中…(img-DE4BIHzH-1713567633064)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-2DLEuCVC-1713567633065)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值