第一种情况下的.equals方法比较内容并给出正确但在第二种情况下它给出了错误,为什么?对于第二种情况,为什么不是这样?
public abstract class Base {
public static void main(String[] args)
{
//case 1
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1.equals(s2)); //true
//case 2
Child c =new Child("abc");
Child c1=new Child("abc");
System.out.println(c.equals(c1)); //false
}
}
public class Child extends Base{
private String obj;
public Child(String string) {
this.obj=string;
//System.out.println(obj);
}
}
}
结果:
true
false
答案 0 :(得分:1)
要在Child
类中测试值相等,您需要Override
等于。因为默认的Object
版本会比较参考 -
@Override
public boolean equals(Object o) {
if (this == o) { // <-- reference identity test.
return true;
}
if (o instanceof Child) {
Child c = (Child) o;
return obj.equals(c.obj);
}
return false;
}
答案 1 :(得分:1)
equals()方法比较两个对象是否相等,如果它们相等则返回true。 Object类中提供的equals()方法使用标识运算符(==)来确定两个对象是否相等。对于原始数据类型,这会给出正确的结果。但是,对于对象,它没有。 Object提供的equals()方法测试对象引用是否相等 - 即,如果比较的对象是完全相同的对象。
要测试两个对象在等效意义上是否相等(包含相同的信息),必须覆盖equals()方法。以下是覆盖equals()的Book类的示例:
public class Child{
...
public boolean equals(Object obj) {
if (obj instanceof Child)
return ISBN.equals((Child)obj.getISBN());
else
return false;
}
}
考虑这个代码来测试Book类的两个实例是否相等:
Child firstChild = new Child("0201914670");
Child secondChild = new Child("0201914670");
if (firstChild.equals(secondChild )) {
System.out.println("objects are equal");
} else {
System.out.println("objects are not equal");
}
即使firstChild和secondChild引用两个不同的对象,此程序也会显示对象相等。它们被认为是相同的,因为比较的对象包含相同的ISBN号。
如果身份运算符不适合您的类,则应始终覆盖equals()方法。
来源:[1]:http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
答案 2 :(得分:0)
您必须覆盖自定义对象上的equals()
方法。
class Child {
@Override
public boolean equals(Object otherObj) {
// TODO Auto-generated method stub
return this.obj.equals(otherObj);
}
}
答案 3 :(得分:0)
public boolean equals(Object anObject):在String中覆盖此方法,在java中覆盖所有包装类,因此您的case 1返回true。
//case 1
//.equal method are overriden in String class
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1.equals(s2)); //true
当你创建自定义类时,它实际上使用了它的超类等于方法,即Object类。 您所需要的只是在类中重写equals方法以使其正常运行。