首页 > 编程语言 >Java(15)Object类

Java(15)Object类

时间:2022-10-01 16:47:15浏览次数:45  
标签:Java otherObject Object equals return 对象 15 方法

前言

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

equals方法

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方法的建议

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

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

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

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

if (!(otherObject instanceof ClassName)) return false;
  1. 将otherObject强制转换为相应类类型的变量:
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方法

标签:Java,otherObject,Object,equals,return,对象,15,方法
From: https://www.cnblogs.com/jiakecong/p/16746855.html

相关文章

  • Java中队列和链表性能对比-ArrayList和LinkedList
    本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。 具体代码如下,可以直接运行importjava.util.ArrayList;importjava.util.LinkedList;importja......
  • 【python】Error:'int' object is not callable
    1、问题rpc接口在调用的时候报错   2、原因这个报错的意思就是int转换时,转换的对象不能调用本次错误,主要是因为int(obj.a)写成了int(obj.a()),导致属性获取失败......
  • Java 集合框架之Collection,一文解决
     JDK提供了一些特殊的类,这些类可以存储任意类型的对象,并且长度可变,在Java中这些被称为集合。按照存储结构可以分为两大类,单列集合Collection和双列集合常用集合类如下......
  • 力扣209(java)-单词规律(简单)
    题目:给定一种规律pattern 和一个字符串 s ,判断s 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存......
  • Java泛型中<T> T 与 T的区别和用法
    有的方法返回值是<T>T,有的是T,区别在哪里?下面是一个泛型方法,<T>声明此方法有一个泛型T,也可以理解声明一个泛型方法.    下面三个T,第一个T表示是泛型,第二个......
  • 肖sir___第二个月Javascript_04
    1.1JavaScript简介JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备JavaScript是......
  • 肖sir___第二个月java操作JDBC_02
    1.1JDBC概述JDBC(JavaDataBaseConnectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同......
  • Java之POI导出Excel(一):单sheet
    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现用POI导出Excel表格。一、pom引用pom文件中,添加以下依赖查看代码 <!--Exc......
  • 肖sir_Java注解__22
    Java注解 1.1注解介绍从Java5版本之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),注解是Java平台中非常重要的一部分。注解都是@符号开头,......
  • 肖sir_Java 8 新特性__21
    1.1Lambda表达式Lambda表达式,也可称为闭包,它是推动Java8发布的最重要新特性。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。语法1,(parameters......