(getClass()!= obj.getClass())对象obj

时间:2019-03-27 05:01:09

标签: java object

  

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而其余的返回条件语句后的代码无法执行?

1 个答案:

答案 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作为返回值退出。