【问题标题】:How do I use the boolean equals(object o) method and call the object the method is applied to?如何使用 boolean equals(object o) 方法并调用应用该方法的对象?
【发布时间】:2013-10-31 20:38:49
【问题描述】:

这就是我目前的方法:

//this method should check if the pokemon are equal//

  public boolean equals(Pokemon other){
  boolean equality;
  if (**XXXXX** == other)
     equality = true;
  else
     equality = false;
  return equality;


   }

所以这应该比较两个对象,但我的问题是如何调用该方法所应用的对象?例如,主代码应该将此 equals 方法应用于 Pokemon a,如下所示:

 if (a.equals(other))
     System.out.println("Pokemon are equal!");

如何在我的方法中输入或调用“a”(应用该方法的对象),以便比较它们是否相等?因为当我将代码中的 XXXXX 替换为:

 if (Pokemon == other)
     equality = true;

我得到错误:

Pokemon.java:130: error: cannot find symbol
  if ( Pokemon == other)
       ^
  symbol:   variable Pokemon
  location: class Pokemon

【问题讨论】:

  • 你还需要覆盖hashCode()。
  • 如果您正在做的是== 比较,那么覆盖equals() 的意义何在?顺便说一句,您根本没有覆盖equals。该方法应该有Object 作为参数类型。
  • 您的equals 方法的整个主体可以替换为return **XXXXX** == other。

标签: java object methods boolean equals


【解决方案1】:

由于您在对象a 上调用.equals(),因此该方法以a 作为其上下文执行,这意味着this 关键字将引用该方法内部的a,就像任何其他方法一样在任何其他对象上调用的方法。

另外,使用== 时要小心。这将查看这两个引用是否引用了内存中完全相同的对象。这不太可能只是您想要的。您更有可能想要检查两个 Pokemon 对象上的各种成员变量以查看 那些 变量是否相等,然后如果它们返回 true 以表明两个 Pokemon 对象确实相等。您选择的变量取决于您和您判断两个口袋妖怪“相等”的标准。

通常,在.equals() 实现的开头实际上会有一个== 检查,因为如果它是真的,那么该方法可以立即返回真,因为引用指的是内存中完全相同的对象。如果== 为假,那么您可以继续检查成员变量或任何其他用于计算相等性的标准。​​

还请注意,您正在重载.equals() 方法,方法是为其参数签名提供Pokemon 类型的引用而不是Object 类型。如果您想真正覆盖基本Object.equals() 方法,您需要这样做:

public boolean equals(Object other) {
    // Comparisons
}

如果您想使用特定于Pokemon 类的方法和成员变量,则需要将other 转换为Pokemon 对象(并使用instanceof)。如果您希望其他使用 .equals() 的 JDK(甚至您自己的)代码调用您的自定义 .equals() 方法,而不是基本的 Object.equals() 方法,则需要此覆盖。

【讨论】:

  • == 检查通常作为equals() 方法中的第一个检查完成。如果为真,那么equals() 可以快速返回真。
  • 是的,我的意思是检查这些变量是否相等(不是内存中的完全相同的对象)。所以目前,虽然口袋妖怪 a 是“皮卡丘 1”,而口袋妖怪另一个是“皮卡丘 1”,但它表示它们不相等。那么我是否应该拆分口袋妖怪内部的变量并进行比较?
  • @user2908614 您的Pokemon 类可能保持不变。在这种方法中你想要做的是检查if (this.name.equals(other.name)) { return true; } 之类的东西。假设Pokemon 类有一个name 变量(猜测是String),那么该行将查看每个口袋妖怪的名称是否相同。如果是这样,.equals() 方法将返回 true。如果要检查更多变量,可以在if 语句中添加更多条件语句。如果您有 name 的访问器/getter 方法(例如 .getName()),我会使用它而不是普通的 .name。
  • @user2908614 太好了!确保标记解决了您的问题的答案,以便其他有相同问题来到 Stack Overflow 的人可以看到问题已解决并希望从中受益。我认为新用户在接受答案之前有一个短暂的阻止期。
【解决方案2】:

您应该在 Pokemon 类中覆盖 Object 提供的 equals 方法,如下所示:

@Override
public boolean equals(Object o)
{
    // check if the "addresses" of o and this object are the same
    if (this == o)
        return true;
    // check if o is of instance Pokemon
    else if (o instanceof Pokemon)
    {
        // need to convert Object to Pokemon - it is save as we already know that
        // the o is actually a Pokemon instance
        Pokemon p = (Pokemon)o;
        // compare fields of o with fields of this instance
        if ((this.someField.equals(p.someField) 
            && (....))
            return true;
    }
    return false;
}

这里的 equals 方法首先检查两个对象是否引用同一个实例,如果不是,它检查 o 是否属于实例 Pokemon,然后比较您需要确定两个对象是否相等的每个字段。

但是请注意,此示例不完整,因为我不知道您为 Pokemon 类定义了哪些字段。当覆盖 equals() 时,最好也覆盖 public int hashCode() - 这里你应该在返回的 hashCode() 中包含你在 equals 中比较的每个字段。延伸阅读:http://www.xyzws.com/javafaq/why-always-override-hashcode-if-overriding-equals/20http://www.javaranch.com/journal/2002/10/equalhash.html

【讨论】:

    【解决方案3】:

    这就是 this 关键字的作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多