Blockquote
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
return false;
}
if ((this.email == null) ? (other.email != null) : !this.email.equals(other.email)) {
return false;
}
if (this.age != other.age && (this.age == null || !this.age.equals(other.age))) {
return false;
}
return true;
}
我对this discussion.中的这段代码有疑问
有这行:
final Person other = (Person) obj;
此条件语句之后:
if (getClass() != obj.getClass()) {
return false;
}
例如,如果getClass()
返回的是Object
以外的类,例如在这种情况下很可能是Person
,那么它不会返回false
而其余的返回条件语句后的代码无法执行?
答案 0 :(得分:2)
obj.getClass()
将返回对象的运行时类,即它将在运行时检查Object
引用指向的是什么。
在getClass()
方法的Java doc中提到了这一点:
返回此对象的运行时类
作为一个简单的测试,您可以自己了解getClass
检查对象的运行时类型:
public static void main(String[] args) {
String s = "hello";
test(s);
}
public static void test(Object o){
System.out.println(o.getClass());
}
尽管编译时的引用类型为String
,但输出将引用Object
类:
class java.lang.String
因此,在您的方法中,如果将false
实例传递给Person
方法,则不会返回equals
。但是,如果它不是Person
实例,则getClass() != obj.getClass()
将是true
,而equals
将以false
作为返回值退出。