当前位置: 首页 > 面试题库 >

覆盖Java equals()方法-不起作用?

隆扬
2023-03-14
问题内容

equals()今天,我遇到了一个有趣(非常令人沮丧)的方法问题,该问题导致我认为是一个经过良好测试的类崩溃了,并导致了一个错误,使我花了很长时间来追踪。

为了完整起见,我没有使用IDE或调试器-只是老式的文本编辑器和System.out。时间非常有限,这是一个学校项目。

无论如何-

我开发一个基本的购物车可能包含ArrayList的Book对象。为了贯彻落实addBook()removeBook()以及hasBook()对车的方法,我想检查,如果Book在已经存在Cart。所以我走了

public boolean equals(Book b) {
    ... // More code here - null checks
    if (b.getID() == this.getID()) return true;
    else return false;
}

在测试中一切正常。我创建6个对象,并用数据填充它们。在上执行许多添加,删除,has()操作Cart,一切正常。我读到你可以拥有equals(TYPE var)或者equals(Object o) { (CAST) var }可以假设,因为它一直在起作用,所以没什么大不了的。

然后,我遇到了一个问题-我需要创建一个Book与对象仅在ID从Book类内它。没有其他数据可以输入。基本上如下:

public boolean hasBook(int i) {
    Book b = new Book(i);
    return hasBook(b);
}

public boolean hasBook(Book b) {
    // .. more code here
    return this.books.contains(b);
}

突然,该equals(Book b)方法不再起作用。如果没有良好的调试器,并且假设Cart该类经过了正确的测试和纠正,这将花费很长时间。将equals()方法交换为以下内容之后:

public boolean equals(Object o) {
    Book b = (Book) o;
    ... // The rest goes here   
}

一切重新开始。是否有一个原因,这种方法决定不采取,即使它清楚地书参数是一个Book对象呢?唯一的区别似乎是它是在同一类中实例化的,并且仅填充了一个数据成员。我非常困惑。拜托,让一些亮点?


问题答案:

在Java中,equals()从其继承的方法Object是:

public boolean equals(Object other);

换句话说,参数必须是类型Object

ArrayList使用正确的equals方法,在此情况下,你始终会调用未正确覆盖Objectequals的方法。

未正确覆盖该方法可能会导致问题。

我每次都覆盖等于以下内容:

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof MyClass))return false;
    MyClass otherMyClass = (MyClass)other;
    ...test other properties here...
}

使用@Override注释可以帮助解决许多愚蠢的错误。

只要你认为自己要重写超类或接口的方法,就可以使用它。这样,如果你做错了,你将得到一个编译错误。



 类似资料:
  • 我正在再次学习一些面向对象的概念,所以我编写了这个简单的代码,只是为了看看重写方法是如何工作的,令人惊讶的是,它不工作了。另外,忽略类名为HelloWorld的事实,它只是一个用于学习目的的文件。它已经改成了Filha。java btw 昨天,错误是线程“main”java中的异常。错误:公共静态void main(String[]args){line中未解决的编译问题,但我关闭了我的计算机,今天

  • 我正在使用用户密钥作为用户表中的主键 它总是显示这样的错误

  • 我想在android中显示弹出窗口时处理back press事件。我确实喜欢这个。在片段中: 在活动中,我确实喜欢这样 问题是,当我第一次按下back按钮时,popupwindow就消失了,override onBackPressed方法没有被调用。除非我按两次后退按钮。我像这样显示我的弹出窗口 谢谢你的帮助

  • 问题内容: 我正在尝试防止旋转一个,但我无法做到这一点。 我正在做这样的事情: 和剧照旋转。UIViewController在以模态打开的UINavigationController内部。 从这里开始,我已经看了很多问题,但没有答案适合我。 在Swift 2中,我曾经重写,但在Swift 3中,该功能不再存在。 在Swift 3中,我该怎么做? 问题答案: 我不知道为什么要投票才能结束这个问题,如

  • 在这个特定的示例中,我扩展了

  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当