在java中覆盖equal方法的正确方法是啥?
Posted
技术标签:
【中文标题】在java中覆盖equal方法的正确方法是啥?【英文标题】: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
,您会发现问题所在。
Overriding the java equals() method quirk 的可能重复项
【参考方案1】:
equals
的签名应该是:
public boolean equals(Object p)
您的public boolean equals(Person p)
方法不会覆盖Object
的equals
。它超载了它。
一种可能的实现方式:
@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可能有效以上是关于在java中覆盖equal方法的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?