在仿照别人博客写equals重写方法的时候,我发现在if(!super.equals(o)) return false;这个语句上我的理解一直存在问题,所以写一篇博客记录一下。
类重写euqals方法
1. 判断两个引用指向的对象是否相等
2. 判断传来的参数是否为当前类或者当前类的子类
3. 比较各个属性值是否相等(其中包括比较父类值的属性)
为什么要用到这句话???
因为如果一个子类继承了父类,那么这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过父类的私有属性和方法,子类是无法直接访问到的。
但是不能直接调用就不代表不能用,这些值不能白白占用内存而无法使用,子类仍然可以通过父类的public修饰的set、get方法来调用这些值。
所以子类之间通过equals方法比较,也要比较从父类继承下来的值的内容,为了代码简洁和复用性,在子类直接调用父类的equals方法,这样就解决了以上问题。
直接来一个代码示例:
import java.util.Objects;
public class People {
private String code;
public void setCode(String code) {
this.code = code;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
People people = (People) o;
return Objects.equals(code, people.code);
}
}
class Teacher extends People{
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
//不加这句返回true,子类的equals方法没有判断code属性值
if(!super.equals(o)) return false;
Teacher teacher = (Teacher) o;
return Objects.equals(name, teacher.name);
}
public static void main(String[] args) {
Teacher teacher1 = new Teacher();
teacher1.setCode("1");
teacher1.setName("张三");
Teacher teacher2 = new Teacher();
teacher2.setCode("2");
teacher2.setName("张三");
System.out.println(teacher1.equals(teacher2));
}
}
参考博客:lombok——@EqualsAndHashCode(callSuper = true)注解的使用
理解误区:
我一直以为if(!super.equals(o)) return false;
这句话是处理 父类对子类实现的场景例如:
class People{}
class Student extends People{}
public static void main(String[] args){
People p = new Student();
}
导致我想了很久也没想出来这句话的实际意义,一直以为这句话是冗余的,放在子类的实际判断之前,先用父类的equals方法来判断父类属性值内容是否相同,如果不同就不用继续判断子类属性值了,从而减少了工作量,但是越想越不对劲,代码也没有这么写的啊,所以就有了这篇博客。