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;
}
У меня есть вопрос об этом коде от это обсуждение.
Есть эта строка:
final Person other = (Person) obj;
после этого условного оператора:
if (getClass() != obj.getClass()) {
return false;
}
Если getClass() возвращает класс, отличный от Object, например, скорее всего Person в данном случае, то не будет ли он возвращать false, а остальная часть кода после условного оператора не будет реализована?




obj.getClass() вернет класс времени выполнения объекта, то есть во время выполнения он проверит, на что указывает ссылка Object.
Это упоминается в документ Java метода getClass():
Returns the runtime class of this Object
В качестве простого теста вы можете сами убедиться, что 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 в качестве возвращаемого значения.