String类和用户定义类的.equals方法

时间:2015-11-10 04:17:35

标签: java

第一种情况下的.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

4 个答案:

答案 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方法以使其正常运行。