理解Java中equals方法的困难
我在mooc课程中学习Java,我在理解这个将比较对象的编写方法示例时遇到问题:理解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
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。