等于即使对象的状态在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方法的实现…在这样做之后,我得到了我所期望的正确答案