class Student{
protect int Id;
protect String name;
protect int score;
public Student(int Id,String name,int score){
this.Id = Id;
this.name = name;
this.score = score
}
public boolean equals(Student other){
if(this.Id == other.Id){
return true;
}
return false;
}
}
如果有一个Student的子类:
class Cadre extends Student{
protect String duty;
}
在Student类中,我们认为只要2个Student的对象的Id相等它们就相等,而Cadre是Student的一个子类,在多态的定义中,可以将子类对象的引用赋给父类,我们同样可以将子类对象与父类对象进行比较,由于在Student的equals方法中,只要一个Student类的对象与Cadre类的对象的Id相等,就认为它们相等,同样可以把个相等的概念应用到它的子类,事实上Cadre类从Student继承来的equals方法就可以帮我们完成比较了。
在进行子类对象与父类对象比较的时候,常常遇到另一种情况:
class Student{
protect int Id;
protect String name;
protect int score;
public boolean equals(Student other){
if(this.Id == other.Id && this.score == this.score && this.name.equals(other.name)){
return true;
}
return false;
}
}
如果它同样有一个子类:
class Cadre extends Student{
protect String duty;
}
在父类中,相等的概念是对象的每个属性都相等,将这个概念扩展到子类,Cadre类可以修该为
class Cadre extends Student{
protect String duty;
public Cadre(int Id,String name,int score,String duty){
super(Id,name,score);
this.duty = duty;
}
public boolean equals(Student other){
if(super(other) == true && this.duty == other.duty){
return true;
}
return false;
}
}
在这中情况下我们可能会遇到一中非常有趣的现象:
Student stu1 = new Student(1,"zhanghua",90);
Cadre stu2 = new Cadre(1,"zhanghua",90,"monitoer");
System.out.println(stu1.equals(stu2));
System.out.println(stu2.equals(stu1));
程序运行后打印出一个true一个false,即是stu1与stu2比较是相等的,而stu2与stu1比较是不相等的,然而,根据相等概念的自反性,我们要求x.equals(y)的值应当与y.equals(x)的值一致,在这种请况下,我们要先检查比较的两个对象的类型是否一致,不一致就直接返回false,将Student类中的equals改为:
public boolean equals(Student other){
if(this.getClass() != other.getClass()){
return false;
}
if(this.Id == other.Id && this.score == this.score && this.name.equals(other.name)){
return true;
}
return false;
}
|