public class Employee {
...
public boolean equals(Object otherObject) {
if(this == otherObject) //①
return true;
if(otherObject == null) //②
return false;
if(getClass() != otherObject.getClass()) //③
return false;
Employee other = (Employee) otherObject; //④
return Objects.equals(name,other.name) && salary == other.salary
&& Objects.equals(hireDay,other.hireDay); //⑤
}
}
关键字return:从一个方法返回。(即当方法中执行了return语句,return之后的语句就不再执行)
①检测this与otherObject是否引用同一个对象。
②检测otherObject是否为null,如果为null,返回false。这项检测是很必要的。
③比较this与otherObject是否属于同一个类。
④将otherObject转换为相应的类类型变量。
⑤对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。
为了防备name或hireDay可能为null的情况,使用Objects.equals方法。如果两个参数都为null,Objects.equals(a,b)调用将返回true;如果其中一个参数为null,则返回false;否则,如果两个参数都不为null,则调用a.equals(b)。
public class EqualsTest {
public static void main(String[] args) {
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
System.out.println("alice1 == alice2: " + (alice1 == alice2)); //true
System.out.println("alice1 == alice3: " + (alice1 == alice3)); //false
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));//true
System.out.println("alice1.equals(bob): " + alice1.equals(bob)); //false
}
}
alice1.equals(alice3)的结果为true
一开始没有明白这个为什么是true,一直在纠结①这个地方,觉得虽然alice3和alice1的实例域的值都相同,但是这是两个对象,他们的引用地址值是不相同的。为什么alice1.equals(alice3)的结果会是true?这个结果为true并不是从①处返回的,而是向下走从⑤处返回的true。