龙空技术网

java 核心技术-12版 卷Ⅰ- 5.2.2 equals 方法

CC躺平混吃 54

前言:

目前看官们对“java核心技术卷一和卷二区别”大体比较关切,我们都想要学习一些“java核心技术卷一和卷二区别”的相关资讯。那么小编同时在网摘上搜集了一些关于“java核心技术卷一和卷二区别””的相关知识,希望小伙伴们能喜欢,大家一起来学习一下吧!

原文5.2.2 equals 方法

Object 类中的 equals 方法用于检测一个对象是否等于另外一个对象。Object 类中实现的equals 方法将确定两个对象引用是否相同。这是一个合理的默认行为:如果两个对象相同,则这两个对象肯定就相等。对于很多类来说,这已经足够了。例如,比较两个 PrintStream对象是否相等并没有多大的意义。不过,经常需要基于状态检测对象的相等性,也就是说,如果两个对象有相同的状态,则认为这两个对象是相等的。

例如,如果两个员工对象的姓名、薪水和雇用日期都一样,就认为它们是相等的(在实际的员工数据库中,比较ID 才更有意义。我们主要用这个示例展示 equals 方法的实现机制)。

public class Employee{	// ...  public boolean equals(Object otherObject){  // a quick test to see if the objects are identical    if (this == otherObject) return true;      	// must return false if the explicit parameter is null    if (otherObject == null) return false;        // if the classes don't match, they can't be equal    if (getClass() != other0bject.getClass()) return false;    	// now we know otherObject is a non-null Employee    Employee other = (Employee) other0bject;// test whether the fields have identical values        return name.equals(other.name)      && salary = other.salary      && hireDay.equals(other.hireDay);  }}

getClass 方法将返回一个对象所属的类,有关这个方法的详细内容稍后进行介绍。在我们的检测中,只有当两个对象属于同一个类时,才有可能相等。

提示:为了防备name 或 hireDay 可能为 null的情况,需要使用 Objects.equals 方法。如果两个参数都为 null,Objects.equals(a,b)调用将返回true; 如果其中一个参数为 null则返回 false;否则,如果两个参数都不为 null,则调用 a.equals(b)。利用这个方法,

Employee.equals 方法的最后一条语句要改写为:

return Objects.equals(name, other.name)

&& salary = other.salary

&& Objects.equals(hireDay, other.hireDay);

在子类中定义 equals 方法时,首先调用超类的 equals。如果检测失败,那么对象就不可能相等。如果超类中的字段都相等,则可以继续比较子类中的实例字段。

public class Manager extends Employee{    public boolean equals(0bject otherObject){    	if (!super.equals(otherObject)) return false;    // super.equals checked that this and otherObject belong to the same class    Manager other =(Manager) otherObject;    return bonus == other.bonus;  }  }

注释:第4章介绍过,记录是一种特殊形式的不可变类,其状态完全由“标准”构造器中设置的字段来定义。记录会自动定义一个比较字段的 equals 方法。两个记录实例中相应字段值相等时,这两个记录实例就相等。

标签: #java核心技术卷一和卷二区别