在Java中因为所有的类默认情况下都继承Object类,而equals方法是在Object类中申明的,所以所有的子类都会继承该方法,而且比较的是两个对象的地址。
父类代码如下:
package chapter3;
public class Box {
private int batch;
public Box(int batch) {
this.batch = batch;
}
public int getBatch() {
return batch;
}
public void setBatch(int batch) {
this.batch = batch;
}
}
子类代码如下:
package chapter3;
// equals方法在父类与子类之间进行比较时的情况
public class PencilBox extends Box{
private String brand;
public PencilBox(int batch,String brand) {
super(batch);
this.brand = brand;
}
public static void main(String[] args) {
Box box = new Box(1);
PencilBox pb = new PencilBox(1,"A");
System.out.println(box.equals(pb));
System.out.println(pb.equals(box));
}
}
这种情况下,两个输出结果都为false,因为比较的对象的地址。
下面是在父类中重写equals方法,比较两个对象的内容是否相等,并且只比较父类的属性值是否相等:
package chapter3;
public class Box {
private int batch;
public Box(int batch) {
this.batch = batch;
}
public int getBatch() {
return batch;
}
public void setBatch(int batch) {
this.batch = batch;
}
// 重写equals方法之后,就变成比较两个对象的内容是否相等
public boolean equals(Object obj) {
if (obj instanceof Box) { // 使用instanceof来判断引用obj所指对象类型,如果是Box类型,就转成Box类型,再比较两个Box对象的batch值
Box box = (Box) obj;
return batch == box.batch;
}
return false;
}
}
这种情况下,两个都结果都为true,因为在子类中调用的是父类重写的equals方法,比较的是两个对象类型是否相同,两个对象的batch属性值是否相等。
现在在子类中也重写equals方法,代码如下:
package chapter3;
// equals方法在父类与子类之间进行比较时的情况
public class PencilBox extends Box{
private String brand;
public PencilBox(int batch,String brand) {
super(batch);
this.brand = brand;
}
public boolean equals(Object obj){
if(obj instanceof PencilBox){
PencilBox pb = (PencilBox)obj;
return super.equals(pb)&&brand==pb.brand;
}
return false;
}
public static void main(String[] args) {
Box box = new Box(1);
PencilBox pb = new PencilBox(1,"A");
// box与pb比较时,由于所有的pb都是Box,并且batch相等,因此equals方法返回true
System.out.println(box.equals(pb));
// pb与box比较时,由于box并不是PencilBox,因此equals方法if语句结果为false
System.out.println(pb.equals(box));
}
}
这种情况第一个输出结果为true,第二个输出结果为false,因为box并不是PencilBox对象,if条件表达式的结果为false,如果我们在这基础上再判断该对象是否为父类对象,如果是则继续判断属性值是否相等,相等结果就为true了,代码如下:
package chapter3;
// equals方法在父类与子类之间进行比较时的情况
public class PencilBox extends Box{
private String brand;
public PencilBox(int batch,String brand) {
super(batch);
this.brand = brand;
}
public boolean equals(Object obj){
if(obj instanceof PencilBox){
PencilBox pb = (PencilBox)obj;
return super.equals(pb)&&brand==pb.brand;
}
// 如果obj不是PencilBox对象,还需要判断obj是不是父类Box的对象
if(obj instanceof Box){
Box box = (Box)obj;
return super.equals(box);
}
return false;
}
public static void main(String[] args) {
Box box = new Box(1);
PencilBox pb = new PencilBox(1,"A");
System.out.println(box.equals(pb));
System.out.println(pb.equals(box));
}
}
这样两个输出结果就都为true了!