public boolean equals(object obj){
Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return super.equals(obj)
}
最后一句return super.equals(obj),为什么要交到父类去判断,难道返回false不是更直接吗?请从下塑造型的角度来回答!
Name name=null;
if(obj instanceof Name){
name=(Name)obj;
if(name.firstname==this.firstname&&name.lastname==this.lastname){
return true;
}else return false;
}
return super.equals(obj)
}
最后一句return super.equals(obj),为什么要交到父类去判断,难道返回false不是更直接吗?请从下塑造型的角度来回答!
return false;
如果t1是t2的派生类,而却t1.firstname==t2.firstname&&t1.lastname==t2.lastname.
那你t2.equals(t1)那你上面的代码判断的结果是什么?是true;
那你反过老t1.equals(t2)也要为true,在派生类的equals方法判断不了结果就交给他的基类去判断。
但是java中所有类的最终基类是Object,所以在t1的所有祖先中都没有办法让t1.equals(t2)为true时最终就是
调用Object的equals方法也就是判断t1是不是一个对象,答案是肯顶的,为true
```
不过:假设this也并非Name类型,但它也含有firstName与lastName属性。当参数obj是Name类型时,可以自己判断;当参数obj不是Name类型时,this与obj的equals()也可以为true,最简单的情况就是this与obj是同一个引用,即this==obj。
综上所述:当参数obj不是Name类型时,也可能返回true,所以交给父类判断好些。
其余的用Object的equals逻辑也好 return false, return true也好
也无所谓了
实际当中都不会这么复杂
重写个equals还父子类?
顶多写个po的equals方法判断判断主键id是否相等就得
子类重写equals方法是因为父类的equals方法不满足子类的需求
比如搂主的例子中如果子类的两个对象名字不同则通过父类的方法来判断,那么
假如父类认为学号相同则两个对象equals,则出现了一下逻辑:①两个姓名相同但学号不同的子类对象equals
②两个姓名不同但学号相同的子类对象equals无论哪个结果都是不符合逻辑的,比较通用的写法如下:
public boolean equals(Object otherobj){
if(otherobj == null) return false;
if(thisobj == otherobj) return true;
if(super(otherobj)){
//你自己的判断逻辑
}
return false;
}