繁体   English   中英

覆盖Java中的equals方法

[英]overriding the equals method in java

“让我们为Stamp类实现equals方法。您需要重写Object类的equals方法。现在您有一个小问题。Object类对图章一无所知,因此将equals方法的otherObject参数变量声明为具有对象类型。重写方法时,不允许更改参数变量的类型。”

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

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));       
     }
}

在这里,由于参数类型不同,因此我不会覆盖从Object类继承的equals()方法。 因此,与其使用我的代码,不应该使用从Object类继承的代码吗?

java.lang.Object equals方法采用Object参数。 你是不是覆盖它如果你把它拿一个Stamp

Joshua Bloch在有效的Java 第3章中告诉您如何正确重写equals hashCode。

严格按照他的建议。 您发布的代码不正确。 您甚至都不会尝试hashCode。 它们应该成对完成。

当您用Java编写方法调用表达式时, 遵循一组复杂的规则来确定将要调用的方法。

基本上,编译器将搜索最具体的方法,该方法可以找到与您尝试传递的参数类型匹配的方法。

这些规则的重要之处在于, 它们没有为Object或任何其他类中的方法做任何特殊规定 Object中的方法与您自己定义的任何方法完全一样。

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

boolean equals(Stamps other)

这比Object上的更具体:

boolean equals(Object other)

(因此,规范中非正式地定义了“更具体”:您可以传递给“更具体”方法的任何参数也可以传递给“不太具体”方法,反之亦然)。

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

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

Object stamp1 = new Stamps("red",10);

那么equals(Stamps)方法将不会被调用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM