Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java中equals方法的困难_Java_Object - Fatal编程技术网

理解Java中equals方法的困难

理解Java中equals方法的困难,java,object,Java,Object,我在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

我在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;
    } 

因此,如果“compared”不是Person类型的对象,那么它将返回false,因此该方法应该停止工作,但是有一些指令可以使它与我们正在比较的对象的类型相同。有人能向我解释一下,在返回false后,尽管没有满足上述条件,但类型为“错误”的对象怎么可能被转换和比较,从而导致方法结束?

如果
比较的
不是
方法返回
false
(即不相等)并结束。
但是,如果使用类型为
Person
的对象调用
equals
,则不满足条件,并且该方法不会返回false,而是继续。如果发生这种情况,我们知道
compared
必须是
Person
类型。但是编译器不知道这一点(如果它更聪明,它可能知道,但它不是)。那么这条线呢

Person comparedPerson = (Person) compared;

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

如果比较的
不是
Person
则该方法返回
false
(即不相等)并结束。
但是,如果使用类型为
Person
的对象调用
equals
,则不满足条件,并且该方法不会返回false,而是继续。如果发生这种情况,我们知道
compared
必须是
Person
类型。但是编译器不知道这一点(如果它更聪明,它可能知道,但它不是)。那么这条线呢

Person comparedPerson = (Person) compared;

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

“返回false后……”返回任何内容后,该方法中的其他内容都不会执行。
返回false
后的填充仅在条件为false时执行,即它是
Person
的实例。给定对象不是Person的实例,在这种情况下,方法返回false;或者对象是Person的一个实例,该方法继续检查其字段是否与
this
相等。误导的是
Person comparedPerson=(Person)compared上面的注释“将对象转换为Person对象”这不是将对象转换为人。它将对象(实际上是一个人)强制转换为Person类型的引用,以便我们可以检查其Person特定属性。如果对象还不是Person的实例,这将导致ClassCastException。“在返回false之后……”在返回任何内容之后,该方法中的任何内容都不会执行。
返回false
后的填充仅在条件为false时执行,即它是
Person
的实例。给定对象不是Person的实例,在这种情况下,方法返回false;或者对象是Person的一个实例,该方法继续检查其字段是否与
this
相等。误导的是
Person comparedPerson=(Person)compared上面的注释“将对象转换为Person对象”这不是将对象转换为人。它将对象(实际上是一个人)强制转换为Person类型的引用,以便我们可以检查其Person特定属性。如果对象还不是Person的实例,这将导致ClassCastException。