public class Student extends Person{
private int stuNum;
public Student(){
}
public Student(String name,int age,int stuNum){
super(name,age);
this.stuNum=stuNum;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Student){
Student s=(Student)obj;
return this.stuNum==s.stuNum;
}
return false;
}
}
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public Person(Person p){
this(p.name,p.age);
}
public String toString(){
return "name:"+name+" ,age:"+age;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Person){
Person p=(Person)obj;
return this.age==p.age&&this.name==p.name;
}
return false;
}
public static boolean equals(Object[] a,Object[] b){
if(a.length!=b.length){
return false;
}
for(int i=0;i<a.length;i++){
if(!a[i].equals(b[i])){
return false;
}
}
return true;
}
public static void main(String[] args) {
Person[] p1={new Person("张一",12),
new Person("张二",12),
new Person("张三",13)
};
Person[] p2={new Person("张一",12),
new Person("张二",12),
new Student("张三",13,20153223)
};
System.out.println(equals(p1,p2));
}
}
运行该段代码,得到的结果是true,
当把输出语句修改成如下时,输出结果为false.
System.out.println(equals(p2,p1));
这是因为第一条输出语句在执行
if(!a[i].equals(b[i])){ return false; }
这条语句时调用的是Person的equals方法,而在Person的equals方法中只比较name和age,不会比较stuNum这个属性,因此得到的结果是true.
第二条的输出结果是false的原因是调用的是Student的equals方法,Person 类不是Student 类的实例,Student的equals方法返回false. 正是运行时多态的性质,才会有这种不一样的结果,然而在实际中,显然这两种情况可能都不满足我们的需求。我们所需要的是:只有当两个对象的值完全一样时才看做相等,部分相等不能看做相等,另外还要做到只比较相同的类。
为了适应实际需求,该Person中equals方法修改如下:
if(!a[i].equals(b[i])||!b[i].equals(a[i])){ return false; }
这么修改的用意在于:当两个类的元素进行比较时,如果有一个子类,一个父类,无论怎么调用equals方法,返回结果都是false. 这样就解决了只比较相同类的问题(注意:在未修改Person的equals方法之前,只有当equals的第一个参数是父类,第二个参数是子类才会返回true)