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

根据JAVA中的属性检查两个对象是否相同,java,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

例如:

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>
junit.framework.AssertionFailedError:应为:但为:
有人能解释为什么会这样吗?我认为
toString
方法可能有问题。

对象中没有
等于(果)
方法。您的
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
,以维护其契约

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码


您的equals必须将对象作为参数;如果你需要水果,jUnit就找不到了。如果您使用的是eclipse,请尝试右键单击您的
Fruit
类,然后选择
Generate equals()和hashcode()