首页 > 解决方案 > 理解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 后,尽管上述条件不满足,但如何转换和比较具有“错误”类型的对象,这应该导致方法结束?

标签: javaobject

解决方案


如果Compared不是 aPerson方法返回false(即不等于)并结束。
但是,如果您equals使用类型的对象进行调用,Person则不满足条件并且该方法不会返回 false 而是继续。如果发生这种情况,我们知道compared必须是 type Person。但是编译器不知道这一点(如果它更聪明,它可以,但事实并非如此)。所以这条线

Person comparedPerson = (Person) compared;

不会“转换”任何东西。该评论具有误导性。这种类型转换只是告诉编译器我们的对象实际上是 type Person。这允许以下代码将其用作 Person 并调用 Person 方法。


推荐阅读