根据JAVA中的属性检查两个对象是否相同

时间:2014-10-20 01:04:47

标签: java

例如:

public class Fruit{
    private String color;
    private double weight;
    ...
    public boolean equals(Fruit a){
        return (this.getColor().equals(a.getColor()) && (this.getWeight()==a.getWeight()));
    }
}

public class Orange extends Fruit{
    public Orange(double weight) {
        super("orange", weight);
    }
}

public class NavalOrange extends Orange{
    public NavalOrange(double weight) {
        super(weight);
    }
}

然后我写了一个关于这个的测试来检查两个对象是否相同。

    Orange orange = new Orange(8);
    NavalOrange navalOrange = new NavalOrange(8);
    assertEquals(orange, navalOrange);

但它只是不断返回错误:

    junit.framework.AssertionFailedError: expected:<Orange@5305068a> but was:<NavalOrange@1f32e575>

任何人都可以解释为什么会这样吗?我认为toString方法可能有问题。

1 个答案:

答案 0 :(得分:2)

equals(Fruit)中没有Object方法。你equals方法应该以......之类的方式开始。

@Override
public boolean equals(Object a) {
    boolean equals = false;
    if (a instanceof Fruit) {
        ...
    }
    return equals;
}

基本上,所有assertEquals正在使用Object#equals。您可以通过向@Override方法添加equals注释来测试这一点,它会产生编译错误,因为`equals(Fruit)不会覆盖它的父级的任何方法......

此外,如果您覆盖equals,则应覆盖hashCode以维持合同......

来自JavaDocs for Object#equals

  

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。