我的代码看起来有点像这样:
public class EqualityTrial {
public static void main(String[] args) {
// TODO Auto-generated method stub
EqualityTrail1 obj1 = new EqualityTrail1();
obj1.setName("Ankit");
obj1.setAge(23);
EqualityTrail1 obj2 = new EqualityTrail1();
obj2.setName("Ankit");
obj2.setAge(23);
if(obj1 == obj2){
System.out.println("== gave true");
}else{
System.out.println("== gave false");
}
if(obj1.equals(obj2)){
System.out.println("equals gave true");
}else{
System.out.println("equals gave false");
}
}
}
每次条件都给出错误。 我知道==比较引用是否指向同一个对象,在这种情况下不是那么错误是正确的结果但是在等于'等于'方法,据我所知它比较两个对象的状态...如果状态是相同的方法应该返回true,在这种情况下返回false,即使两个对象的状态相同。我错过了什么吗?
答案 0 :(得分:5)
equals
仅在您使用比较状态的实现在EqualityTrail1
类中覆盖它时才比较状态。如果不覆盖它,则使用默认实现(来自Object类),并且该实现比较引用(因此它的行为与==
完全相同)。
可能的实施:
public class EqualityTrail1
{
...
@Override
public boolean equals (Object other)
{
if (!(other instanceof EqualityTrail1))
return false;
EqualityTrail1 oet = (EqualityTrail1) other;
return this.name.equals(oet.name) && this.age == oet.age;
}
}
答案 1 :(得分:1)
如果你想要equals to work属性,你必须实现一个自己的equals变种(Object obj)。
在那里,您可以指定如何将“测量”等于应用于对象。
一些示例(使用Eclipse,Source选项卡):
public class MyClass {
String sequence;
public MyClass(String seq) {
this.sequence = seq;
}
@
Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((sequence == null) ? 0 : sequence.hashCode());
return result;
}
@
Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
if (sequence == null) {
if (other.sequence != null)
return false;
} else if (!sequence.equals(other.sequence))
return false;
return true;
}
}
答案 2 :(得分:0)
您是否重写过课程equals
的{{1}}方法?如果不是这就是问题。如果是,则发布您的EqualityTrail1
方法
答案 3 :(得分:0)
除非你提供equals
的实现,它应该依次比较每个字段,否则Java将使用java.lang.Object
中的默认版本,根据JLS:
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
因此,由于你有两个不同的对象,默认情况下它们不比较相等。
答案 4 :(得分:0)
我没有覆盖equals方法....在做同样的工作之后感谢。