• Java(15)Object类


    前言

    Object类是Java中所有类的始祖,在Java中每个类都扩展了Object。如果没有明确地指出超类,Object就被认为是这个类的超类。由于在Java中每个类都是由Object类扩展而来的,所以熟悉这个类提供的所有服务十分重要。
     

    equals方法

    equals方法用于检测一个对象是否等于另外一个对象。在Object类中,equals方法比较的是两个对象的地址值,地址值相同返回true,否则返回false,以下是其源码:

    highlighter- Java
    public boolean equals(Object obj) {
        return (this == obj);
    }

    ==运算符的使用:对于基本数据类型,其比较的是对象的数值;对于引用数据类型,其比较的是对象的地址值。
     

    重写equals方法

    在Object类中,equals方法比较的是两个对象的地址值,然而这样的比较意义不大,我们更希望根据两个对象的属性值是否相同来判断这两个对象是否“相等”,因此我们在自己创建对象时需要重写equals方法,以下是自己创建的Employee类中的具体重写代码:

    highlighter- Java
    public class Employee {
        private String name;
        private double salary;
        private LocalDate hireDay;
        
        // 重写equals方法,传入Object对象
        public boolean equals(Object otherObject) {
            // 若参与比较的两个对象是同一个对象(地址值相同),直接返回true,只是为了提高代码执行效率
            if (this == otherObject) {
                return true;
            }
            
            // 判断非空
            if (otherObject == null) {
                return false;
            }
            
            // 判断2个对象是否属与同一个类
            if (getClass() != otherObject.getClass()) {
                return false;
            }
            
            // 将Object类型强转成Employee类
            Employee other = (Employee) otherObject;
            
            // 返回对象是否相等的结果
            return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
        }
    }

     

    objects.equals()

    在重写equals方法的最后使用了Objects.equals()函数,Objects类是JDK7之后添加的一个工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是空指针安全的,其中Objects.equals()就是为了防止Object.equals()中容易出现空指针异常的现象
    源码如下:

    highlighter- JavaScript
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

     

    编写equals方法的建议

    1. 显示参数命名为otherObject,稍后需要将它强制转换成另一个名为other的变量
       
    2. 检测thisotherObject是否相等:
    highlighter- Java
    if (this == otherObject) return true;

      这条语句只是一个优化。实际上,这是一种经常采用的形式。因为检查身份要比逐个比较字段开销小。

    1. 检测otherObject是否为null,如果为null,返回false。这项检测是很有必要的。
    highlighter- Java
    if (this == otherObject) return false;
    1. 比较this与otherObject的类。如果equals的语义可以在子类中改变,就使用getClass检测
    highlighter- Bash
    if (getClass() != otherObject.getClass()) return false;

      如果所有的子类都有相同的相等性语义,可以使用instanceof检测

    highlighter- Java
    if (!(otherObject instanceof ClassName)) return false;
    1. 将otherObject强制转换为相应类类型的变量:
    highlighter-
    ClassName other = (ClassName) otherObject
    1. 根据相等性概念的要求来比较字段。使用==比较基本类型字段,使用Objects.equals比较对象字段。如果所有的字段都匹配,就返回true;否则返回false。
      如果子类中重新定义equals,就要在其中包含一个super.equals(other)调用
       

    hashCode

    散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashCode()y.hashCode()基本上不会相同。

    如果重新定义了equals方法,就必须为用户可能插入散列表的对象重新定义hashCode方法
    hashCode方法应该返回一个整数(也可以是负数),并且equals与hashCode的定义必须相容:如果x.equals(y)发那会true,那么x.hashCode()就必须与y.hashCode()返回相同的值。例如,如果定义Employee.equals比较员工的ID,那么hashCode方法就需要散列ID,而不是员工的姓名或存储地址。
     

    toString

    在Object中有一个重要的方法,就是toString方法,它会返回表示对象值的一个字符串。默认打印的是类名+哈希编码的形式,由于这种形式正常人看不懂,所以我们需要重写这个方法,打印一些容易看都懂的描述信息。
    一般调用方法有2种:

    • 当一个引用对象和字符串作连接的时候,会自动调用toString方法
    • 直接打印引用对象

    如果类中没有toString方法,又由于Object类是所有类的超类,所以我们会调用Object中的toString方法,但是默认的打印格式是:类名+哈希编码,所以我们需要重写toString方法,最后这里强烈建议为自定义的每一个类添加toString方法


    __EOF__

  • 本文作者: Silent丿丶黑羽
  • 本文链接: https://www.cnblogs.com/jiakecong/p/16746855.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【Java开发岗:项目篇】
    Linux操作系统-信号量
    基于Java毕业设计信息工程学院办公经费管理系统服务端源码+系统+mysql+lw文档+部署软件
    Pytorch学习之路 - CNN
    LeetCode 104. 二叉树的最大深度
    使用 spring-security-oauth2 体验 OAuth 2.0 的四种授权模式
    ​如何使用ArcGIS Pro制作一张地形图
    什么是Rebex Total Pack for.NET?
    linux下C语言如何操作文件(三)
    或许我们并不需要 default exports
  • 原文地址:https://www.cnblogs.com/jiakecong/p/16746855.html