在java中重写equals方法

在java中重写equals方法,java,Java,“让我们为Stamp类实现equals方法。 您需要重写对象类的equals方法。 现在你有一个小问题。 对象类对stamp一无所知,所以 它声明了otherObject equals方法的参数变量的类型为 对象。重写该方法时,不允许更改参数变量的类型。“ 这里,它表示不允许更改参数变量的类型。 然而,当我使用下面的代码时,它给出了正确的结果 public class Stamps { private String color; private int value; public

“让我们为Stamp类实现equals方法。 您需要重写对象类的equals方法。 现在你有一个小问题。 对象类对stamp一无所知,所以 它声明了otherObject equals方法的参数变量的类型为 对象。重写该方法时,不允许更改参数变量的类型。“

这里,它表示不允许更改参数变量的类型。 然而,当我使用下面的代码时,它给出了正确的结果

public class Stamps
{
  private String color;
  private int value;

  public Stamps(String color, int value)
  {
    this.color=color;
    this.value=value;
  }

    public boolean equals(Stamps other)
    {
       return color.equals(other.color)
            && value== other.value;
    }
}


public class Main
{
     public static void main(String[] args)
     {
          Stamps stamp1 = new Stamps("red",10);
          Stamps stamp2 = new Stamps("green",10);

        System.out.println(stamp1.equals(stamp2));       
     }
}

这里,我并没有重写从对象类继承的equals()方法,因为参数类型不同。因此,与其使用我的代码,它不应该使用从Object类继承的代码吗?

java.lang.Objectequals方法采用
Object
参数。如果将其设置为带有
标记
,则不会覆盖它

Joshua Bloch告诉您如何在有效的Java中正确地重写equals和hashCode


严格遵循他的建议。您发布的代码不正确。您甚至都不尝试哈希代码。它们应该成对完成。

当您在Java中编写方法调用表达式时,将遵循以下步骤来确定将调用哪个方法

基本上,编译器将搜索它能找到的最具体的方法,该方法与您试图传递的参数类型相匹配

关于这些规则,重要的是它们没有对
对象
或任何其他类中的方法做出特殊规定。
Object
中的方法与您自己定义的任何方法完全相同

因此,如果您试图在类
Stamps
的实例上调用
equals
方法,将
Stamps
的单个实例作为参数传递,它将找到您的方法:

boolean equals(Stamps other)
这比
对象上的更具体:

boolean equals(Object other)
(“更具体”是规范中非正式定义的,因此:可以传递给“更具体”方法的任何参数也可以传递给“不太具体”的方法,但反之亦然)

因此Java编译器将选择调用
equals(Stamps)
方法

但是,如果要将变量的第一个或第二个(或两个)声明更改为
Object
类型:

Object stamp1 = new Stamps("red",10);
然后将不会调用
equals(Stamps)
方法:

  • 对于
    对象stamp1
    ,这是因为Java将搜索
    对象类型以查找匹配的方法。由于
    Object
    上只存在
    equals(Object)
    ,因此这是唯一可以调用的
  • 对于
    Object stamp2
    ,这是因为
    equals(Stamps)
    的参数类型不匹配,因此唯一可能调用的方法是
    equals(Object)

选择了最具体的签名,这就是您的重载。在
equals
方法上添加一个
@Override
注释,看看会发生什么。您正在定义自己的函数,该函数恰好与
对象#equals
同名,但您没有覆盖它。它为您的特定代码提供正确的结果,但对于处理任意对象(如映射和集)的代码,它将不起作用(而且很难调试原因)。将第二条语句更改为
Object stamp2=new Stamps(“红色”,10)
,然后再次尝试运行它。请尝试
Object obj3=new Stamps(“红色”,10)。请注意,变量的类型为
Object
。还要注意,分配给它的对象应该等于
stamp1
。试试看:试试
obj3.equals(stamp1)
stamp1.equals(obj3)
。我希望这两次都是假的。如果我知道了,你就没有得到正确的结果。