Java覆盖父等于方法

时间:2014-12-16 15:26:51

标签: java

我有两个班级PersonTeacher。在Person类中,我使用compareTo方法检查传入的两个对象是否相等。在Teacher类中,我正在处理的问题表明我需要覆盖Person中的equals方法。在这个equals方法中,它返回true的唯一方法是它在equalsPerson中的Teacher方法中是否相等。我的问题是,当我检查Teacher的{​​{1}}方法时,我是否只需调用equals以检查父类是否相等这两个对象或还有什么我需要做的吗?

人:

super.equals(other)

教师

public class Person implements Comparable<Person> {


    public boolean equals(Object other) {
        try {
            return this.compareTo(other) == 0;
        }catch(Exception e) {
            return false;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

基本上,Object#equals的合同规定:

  

它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true

Teacher#equals的实施并不符合此要求。对于在继承自非equals的另一个类的类中实现Object方法的情况,例如Teacher,您应该验证要比较的对象的类型是您要比较的类相同。为此,您应该使用getClass().equals

public class Teacher extends Person {
    private String facultyID;
    @Override
    public boolean equals(Object other) {
        //this line is nonsense, not all Persons are Teachers
        //boolean personEquals = super.equals(other);

        //avoid using try-catch
        //try {

        //verify that the other object is not null
        if (other == null) {
            return false;
        }

        //verify that the other object is specifically a Teacher, not a super or a subclass of it
        if (this.getClass().equals(other.getClass()) {
            //here comes the real check
            Teacher otherTeacher = (Teacher)other;
            return this.facultyID.equals(otherTeacher.facultyID);
        }
        return false;
    }
}

Person执行类似操作,以防它不允许与它的子类进行比较。