java - 理解Java中的equals方法的麻烦
问题描述
我正在从 mooc 课程中学习 Java,但我无法理解这个将比较对象的编写方法示例:
public class Person {
private String name;
private int age;
private int weight;
private int height;
// constructors and methods
public boolean equals(Object compared) {
// if the variables are located in the same position, they are equal
if (this == compared) {
return true;
}
// if the compared object is not of type Person, the objects are not equal
if (!(compared instanceof Person)) {
return false;
}
// convert the object into a Person object
Person comparedPerson = (Person) compared;
// if the values of the object variables are equal, the objects are equal
if (this.name.equals(comparedPerson.name) &&
this.age == comparedPerson.age &&
this.weight == comparedPerson.weight &&
this.height == comparedPerson.height) {
return true;
}
// otherwise the objects are not equal
return false;
}
// .. methods
}
尽管对每个步骤都进行了评论,但我不明白该方法继续执行的事实
if (!(compared instanceof Person)) {
return false;
}
因此,如果“比较”不是 Person 类型的对象,它会返回 false,所以该方法应该停止工作,但是有一些指令可以使它成为我们正在与之比较的相同类型的对象。有人可以向我解释一下,返回 false 后,尽管上述条件不满足,但如何转换和比较具有“错误”类型的对象,这应该导致方法结束?
解决方案
如果Compared
不是 aPerson
方法返回false
(即不等于)并结束。
但是,如果您equals
使用类型的对象进行调用,Person
则不满足条件并且该方法不会返回 false 而是继续。如果发生这种情况,我们知道compared
必须是 type Person
。但是编译器不知道这一点(如果它更聪明,它可以,但事实并非如此)。所以这条线
Person comparedPerson = (Person) compared;
不会“转换”任何东西。该评论具有误导性。这种类型转换只是告诉编译器我们的对象实际上是 type Person
。这允许以下代码将其用作 Person 并调用 Person 方法。
推荐阅读
- android - 在片段转换期间隐藏 BottomNavigationView
- c - 是否可以使用条件变量和信号而不是广播来创建生产者消费者问题?
- r - 排除列时改变的正确语法,第 2 部分
- angular - 如何在 Angular App 中从服务器获取嵌套数据?
- r - 在 R 中分组和运行 For 循环
- java - 将变量初始化为空是反模式吗?
- javascript - 如何在点击时在文本下方而不是在文本上方显示弹出文本
- r - 对R中的多个向量使用tapply和cumsum函数
- c# - 可以将变量的引用保存在 c# 中的另一个变量中吗?
- javascript - 如何使用 Javascript 更改新选项卡的标题?