【发布时间】:2016-01-05 14:25:58
【问题描述】:
我想使用自定义的 equals 方法比较两个人的统计信息,该方法将覆盖 Object 类中的 equals 方法。由于这个equals方法的返回类型将是一个布尔值,我知道我需要传入(Object obj)参数。当我定义新的 equals 方法时,我被告知我需要首先检查 obj 类是否与实例类不匹配。验证后,我将 obj 类类型转换为实例类,然后可以继续执行其余代码。
但是,我不明白为什么我需要验证 obj 类与实例类不匹配。我认为这两个类应该不匹配,因此需要类型转换。
谁能告诉我为什么我们需要验证 obj 类与实例类不匹配?我正在处理的代码写在下面。
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != this.getClass())
return false;
else {
Person pp2 = (Person) obj;
if (this.name.equals(pp2.name) && this.age == pp2.age)
return true;
else
return false;
}
}
public static void main(String[] args) {
Person ps1 = new Person("Buddy", 14);
Person ps2 = new Person("Buddy", 14);
if (ps1.equals(ps2))
System.out.println("Same");
}
【问题讨论】:
-
可能有两个不同的类具有相同的变量。 Student vs Person,都有名字和年龄,但是他们是不同的类。
-
在一个侧节点上,使用
obj instanceof Person将同时进行,检查类是否相等以及obj是否不为空 -
既然 ps2 来自 Person 类,而 obj 来自 Object 类,那么在你可以类型转换之前调用 ps1.equals.ps2 类匹配验证不会总是失败任何事物?这就是我感到困惑的原因。
-
@OmarN ps2.equals(new Person()) 将创建人的 obj 实例。所以 getClass 将返回 Person 类。
-
明白了。谢谢!