栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java的equals方法的一些理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的equals方法的一些理解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 前言
  • 一、Object类的equals方法?
  • 1. Object是什么?
  • 2. equals方法的解析
  • 1、 为什么需要这个方法?
  • 2、 equals方法在书上的解析
  • 3. 对上公司的Object类方法的理解
  • 4. 对上公司对重写的equals方法的一些理解
  • 总结


前言

这一篇文章是对java的Object的方法的equals的描述,也包括对重写方法写的一些理解。


一、Object类的equals方法? 1. Object是什么?

首先要明确Object类中有什么,它是什么?
Object类在《java核心技术1》中是这样描述的是Java中所有类的始祖,每个类都是尤其扩展出来的。所以我们创建的类应该都会有应该有这样的表达:

public class Classname extends Object{ }

但其实上公司早已经考虑过这个问题了,所以每个类都是默认继承Object的。所以直接就可以就可以引用Object类中的方法,编译器是不会报错的。

2. equals方法的解析 1、 为什么需要这个方法?

因为传统的逻辑判断“ == ”,是去判断数据在内存堆中地址,基础数据在堆中内存是相同的,所以 “ ==”最后是对数据的值来进行比较的。

2、 equals方法在书上的解析

在《Java核心技术1》中对equals方法的描述是用于检查一个对象是否等于另一个对象,这两个对象是否具有相同的引用。然后接下来我会使用代码,以及代码运行的结果对这个方法进行讲解。

public class Employee extends Person{
    private int salary;
    private int worktime;


    public Employee(String name, String sex,int salary, int worktime) {
        this.name = name;
        this.sex = sex;
        this.salary = salary;
        this.worktime = worktime;
    }



        //step1
        Employee employee1 = new Employee("啊狗","男",2000,12);
        Employee employee2 = new Employee("啊狗","男",2000,12);
        //现在我们创造两个数据皆相同的对象我们现在进行equals方法的判断
        System.out.println(employee1.equals(employee2));

终端会给我们输出false,我们可以开调试来看看为什么会输出flase。我们可以看到employee1和employee2地址会不同,这就能解释到《Java核心技术1》对Object类中的equals方法是对比一个对象是否等于另外一个对象。这不仅仅局限于数据的相同,也需要去判断数据存放的地址是否相同。

3. 对上公司的Object类方法的理解

深入的我们可以去看看上公司如何写Object类的equals方法。

 public boolean equals(Object obj)
        return (this == obj);
    }

这里的equals方法接入的是Object类, (this == obj)这句话的意思是当前对象和传入obj地址是否相等,因为 “==”的作用就是比较两者地址是否相同。

4. 对上公司对重写的equals方法的一些理解

那么接下来我们研究方向就是如何让两个数据相同的对象相同,这一点由为之重要。上公司已经非常贴心地为我们重写好了这个方法,我们可以一起看看这个方法地实现。

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return salary == employee.salary && worktime == employee.worktime;
    }
if (this == o) return true;

这句话是自反性的体现,先使用this调用当前对象,然后再将对象o放入判断语句中,也就是书中所说的对于非空引用x,x.equals(x)会返回true。

if (o == null || getClass() != o.getClass()) return false;

这句话是将调用getClass()方法,因为两个不同的类不可以做比较,会直接返回false的。具体我们可以利用我们的Student类和Employee类来做比较。

 Employee employee1 = new Employee("啊狗","男",2000,12);
        Student student = new Student("啊猫","男",18,"智能科学");
        //2.再使用Student类和Employee类进行比对
        System.out.println(employee1.equals(student));

无论从直观上还是客观上来看,我们都能会觉得终端会输出false,事实如此,确实最后终端是输出了false。

Employee employee = (Employee) o;

这句话又是什么意思呢?这个涉及一个强制类型转化的知识,因为所有类都默认继承或者间接继承Object类,因为前面已经使用getClass方法来判断类是否相同,所以这里不需要进行instanceof来判断两个类是否相同,如果两个类不同的话,直接运行java会抛出ClassExceptionError错误。这一步就是让传入的值获得自己私有得信息,这一个点是涉及多态的缺点的缘由。

return salary == employee.salary && worktime == employee.worktime;

这一句话我们可以通过调试来看看到底相比较的是什么?我们可以看到是将当前对象的salary和worktime的值来和传入对象的salary和worktime的值比较,这样就可以免除“==”比较地址而造成最后的结果和主观感觉不一样的预期。


总结

这篇文章是我第一次写博客,文章结合《java核心技术1》对Object类中的equals方法的一点理解的,本来想写Object类常用API的一个汇总,但是鉴于能力的不足,所以最后仅仅只是写了equals方法的理解。这一次编写博客的过程中,我明显发现自己对很多不理解的地方,本文如果有讲解错误,或者讲解不当的地方,希望大家能指正我的错误,感谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820811.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号