等于即使对象的状态在java中相同,也给出false
我的代码看起来有点像这样:等于即使对象的状态在java中相同,也给出false,java,Java,我的代码看起来有点像这样: 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 = n
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,即使两个对象的状态相同。我在这里遗漏了什么吗?
equals
仅当您在EqualityTrail1
类中使用比较状态的实现重写它时,才会比较状态。如果不重写它,将使用默认实现(来自对象类),该实现将比较引用(因此它的行为将与==
完全相同)
一种可能的实施方式:
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;
}
}
equals
仅当在EqualityTrail1
类中使用比较状态的实现重写状态时,才会比较状态。如果不重写它,将使用默认实现(来自对象类),该实现将比较引用(因此它的行为将与==
完全相同)
一种可能的实施方式:
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;
}
}
您是否重写了类
EqualityTrail1
的方法equals
?如果不是,这就是问题所在。如果是,发布您的equals
方法您是否重写了类equals
的方法equals
?如果不是,这就是问题所在。如果是,发布您的equals
方法,除非您为equals
提供了一个实现,它应该依次比较每个字段,Java将使用Java.lang.Object
中的默认版本,根据JLS:
类对象的equals方法实现了最有区别的
对象上可能的等价关系;也就是说,对于任何非空
参考值x和y,当且仅当x
和y引用同一个对象(x==y的值为true)
因此,由于您有两个不同的对象,它们在默认情况下不会比较相等。除非您为
equals
提供一个实现,该实现应依次比较每个字段,否则Java将使用Java.lang.Object
中的默认版本,根据JLS:
类对象的equals方法实现了最有区别的
对象上可能的等价关系;也就是说,对于任何非空
参考值x和y,当且仅当x
和y引用同一个对象(x==y的值为true)
因此,由于您有两个不同的对象,因此默认情况下它们不会比较相等。如果您希望使用equals to work属性,则必须实现自己的equals变体(Object obj) 在这里,您可以指定如何将相等性的“测量”应用于对象 一些示例(使用Eclipse,Source选项卡):
公共类MyClass{
字符串序列;
公共MyClass(字符串顺序){
该序列=seq;
}
@
推翻
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((sequence==null)?0:sequence.hashCode();
返回结果;
}
@
推翻
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
MyClass other=(MyClass)obj;
if(sequence==null){
if(other.sequence!=null)
返回false;
}else如果(!sequence.equals(other.sequence))
返回false;
返回true;
}
}
如果需要equals to work属性,则必须实现自己的equals变体(Object obj)
在这里,您可以指定如何将相等性的“测量”应用于对象
一些示例(使用Eclipse,Source选项卡):
公共类MyClass{
字符串序列;
公共MyClass(字符串顺序){
该序列=seq;
}
@
推翻
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((sequence==null)?0:sequence.hashCode();
返回结果;
}
@
推翻
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
MyClass other=(MyClass)obj;
if(sequence==null){
if(other.sequence!=null)
返回false;
}else如果(!sequence.equals(other.sequence))
返回false;
返回true;
}
}
我没有覆盖equals方法…在做了同样的事情之后,它工作了,谢谢。我没有覆盖equals方法…在做了同样的事情之后,它工作了,谢谢。如果我没有覆盖它将要覆盖什么?如果我没有覆盖它将要覆盖什么?对于你的EqualityTrail1类,实现equals方法然后比较。请参阅此处的操作方法:它不比较对象的状态。对于EqualityTrail1类,请实现equals方法,然后比较。看这里如何做:它不比较对象的状态。你能详细说明你的答案吗?我意识到我在我的类中提供了equals方法的实现…在这样做之后,我得到了我期望的正确答案。你能详细说明你的答案吗?我意识到我在我的类中提供了equals方法的实现…在这样做之后,我得到了我所期望的正确答案