根据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()
。