【问题标题】:What's the correct way to override equal method in java?在java中覆盖equal方法的正确方法是什么?
【发布时间】:2015-05-06 23:09:09
【问题描述】:
public class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public boolean equals(Person p) {
        System.out.println("..............");
        return p.name.equals(this.name);
    }
}

您好,我正在处理 OCJP 问答,这个问题的答案是 equals 方法没有正确覆盖 Object.equlas 方法。

我认为在这里用字符串覆盖是多余的,但是这个问题的答案也不正确。

你能指出我在这里缺少什么概念吗...

注意:对于这个问题,没有选项说用相同的参数覆盖 hasCode 和 equlas...

【问题讨论】:

  • 首先,删除System.out.println..
  • 你为什么不使用IDE为你生成一个?
  • 提示:尝试使用@Override,您会发现问题所在。

标签: java


【解决方案1】:

equals 的签名应该是:

public boolean equals(Object p)

您的public boolean equals(Person p) 方法不会覆盖Objectequals。它超载了它。

一种可能的实现方式:

@Override
public boolean equals(Object other)
{
    if (!(other instanceof Person))
        return false;
    Person p = (Person) other;
    return p.name.equals(this.name);
} 

【讨论】:

  • public boolean equals(Object p){return ((Person)p).name.equals(this.name);} 这是正确的签名吧?
  • @RajeshKumar: ClassCastException
  • @RajeshKumar 不完全是。在将p 封装为Person 之前,您应该验证它实际上是一个Person 实例。
  • @Eran 好的...谢谢。明白了。
  • @LocHa 如果name 可能为空,您必须测试该场景并返回适当的值,但我假设没有名称的 Person 不是可能的场景(构造函数of Person 应该包含一个可以防止这种情况发生的验证)。
【解决方案2】:
@Override
public boolean equals(Object ob) {

    if (!(ob instanceof Person)) {
        return false;
    }

    Person p = (Person)ob;

    return p.name.equals(this.name);
}

ClassCastException 证明
NullPointerException 证明 (Is null check needed before calling instanceof)

【讨论】:

  • 附加我要补充: if (this == obj) return true;如果(obj == null)返回false;如果 (getClass() != obj.getClass()) 返回 false; Persona 其他 = (Person) obj;
  • 有时传递null可能有效
猜你喜欢
  • 2013-03-08
  • 2019-05-04
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多