如何使用boolean equals(object o)方法并调用应用该方法的对象?

时间:2013-10-22 19:47:06

标签: java object methods boolean equals

这就是我目前的方法:

//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

3 个答案:

答案 0 :(得分:2)

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

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

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

另请注意,重载 .equals()方法,方法是为其参数签名提供Pokemon类型的引用,而不是类型Object。如果您想真正覆盖基本Object.equals()方法,您需要执行以下操作:

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

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

答案 1 :(得分:1)

你应该在你的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/20 http://www.javaranch.com/journal/2002/10/equalhash.html

答案 2 :(得分:0)

这就是this关键字的作用。