Java(15)Object类

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

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

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

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

重写equals方法

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

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() 中容易出现空指针异常的现象
源码如下:

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

编写equals方法的建议

if (this == otherObject) return true;

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

if (this == otherObject) return false;
if (getClass() != otherObject.getClass()) return false;

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

if (!(otherObject instanceof ClassName)) return false;
ClassName other = (ClassName) otherObject

散列码(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,而不是员工的姓名或存储地址。

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

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

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

Original: https://www.cnblogs.com/jiakecong/p/16746855.html
Author: Silent丿丶黑羽
Title: Java(15)Object类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590042/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql查出指定时间段中的每天的日期

    背景:数据库中某个业务表产生的数据日期不连续的,比如出库表,本月5号和27号可能都没有出库记录。前端报表组件要求传入连续的日期以便渲染数据 需求:返回指定日期时间段内的每天的出库量…

    Java 2023年6月8日
    067
  • spring 工具类大集合

    org.springframework.util.AntPathMatcher 它可以帮助我们做一些路径的匹配,可以用于路径映射规则匹配 。? (任何单字符) * (任意数量字符)…

    Java 2023年6月5日
    0114
  • 文字隐写术-盲水印研究笔记【原创】

    gitee 开源代码(java) https://gitee.com/chejiangyi/shuiyin/tree/master 需求概述 研究盲水印对于版权保护的效果和能力 研…

    Java 2023年6月8日
    074
  • 将springboot安装成windows服务启动。

    下载Windows Service Wrapper 本文下载了winsw-2.3.0-bin.exe。 新建一个目录aiplatformService 在目录里面新建一个aipla…

    Java 2023年5月30日
    0106
  • spring*.xml配置文件明文加密

    系统架构:spring+mvc(Oracle是用jdbc自己封装的接口) 1.数据库配置文件加密 原xml配置 ….. 加密实现过程 思路:继承DruidDataSource,…

    Java 2023年6月8日
    079
  • ICMP 介绍

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    054
  • VBA中Selection.TypeText长度限制的替代写法

    | 0.06分钟 | 100字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/6/5 AM11:34 | 系列 | 已完成 每…

    Java 2023年6月5日
    073
  • 第四周总结-SSM框架整合

    java;gutter:true;</p> <h2>1,SSM整合</h2> <h3>1.1 流程分析</h3> &lt…

    Java 2023年6月7日
    048
  • 云服务发布springboot项目踩过的坑

    参考文档: !!千万要卸载openJDK!!! 云服务器部署springboot项目,其他博主参考文档:https://blog.csdn.net/m0_54853420/arti…

    Java 2023年6月6日
    060
  • Java入门

    Java特性和优势 简单性 面向对象 可移植性(最重要的优势)write once, run anywhere 高性能 分布式 动态性 多线程 安全性 健壮性 Java三大版本 J…

    Java 2023年6月6日
    084
  • Gitlab-CICD最简单明了的入门教程

    CICD是什么? 由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总…

    Java 2023年6月8日
    071
  • HIT软构博客7–学习UML类图

    UML的各种线和箭头到底是什么意思 1 泛化泛化表示⼀个更泛化的元素和⼀个更具体的元素之间的关系。即继承extends ⽤实线空⼼三角形箭头表⽰。箭头方向从子类到父类。 2实现 实…

    Java 2023年6月5日
    062
  • MybatisPlus 快速入门

    MybatisPlus 1.简介 官网:https://baomidou.com/pages/24112f/#特性 特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如…

    Java 2023年6月9日
    081
  • SSM整合SpringSecurity 时遇到的错误

    1.在pom.xml加入SpringSecurity的依赖 2.在web.xml加入springsecurity 的过滤器配置 3.编写一个配置类WebAppSecurityCon…

    Java 2023年6月9日
    081
  • Golang中的defer、panic与recover关键字

    一、defer关键字 1.defer关键字定义了在当前函数生命周期结束之前触发的一种机制,类似于C++中的析构函数,Java中的final关键字。如在main函数中定义: defe…

    Java 2023年6月13日
    067
  • MyBatis学习(一)

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射;MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作;MyBatis …

    Java 2023年6月6日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球