对象的equals方法?

时间:2020-03-25 00:10:37

标签: java equals

有人可以解释为什么第一个代码等于false,第二个代码等于true吗? enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

Java中的所有对象均以equals(Object)基类中的Object方法开头。您的第二个示例只是覆盖了此方法,因此,每次调用equals(Object)方法时,都会使用覆盖实现,而不是基本实现。

但是,在第一个示例中,您为equals()方法添加了 new 重载,其参数列表与基于Object.equals()的方法不同。当这两个都成立时,只要您调用它,就会使用此重载:

  1. 用于调用该方法的引用的编译时类型为Circle,并且
  2. 传递给该方法的参数的编译时类型为Circle

第一个条件是必需的,以便编译器可以首先找到该方法。如果调用的目标实例的编译时类型不是Circle,则该方法的equals(Circle)重载甚至都不会被考虑。

第二个条件是必需的,以便编译器可以将equals(Circle)重载标识为要调用的重载。如果在编译时未知要传递的参数为Circle,则编译器将无法安全地使用equals(Circle)方法,而必须选择equals(Object)重载。

在您的第一个示例中,方法调用的目标实例以及传递给该方法的参数的编译时类型均为Object,而不是Circle。因此,编译器没有安全的方法来调用equals(Circle)重载,而必须调用equals(Object)。并且该重载(基本实现)仅比较两个对象的引用,仅当它们相同时才返回true(在这种情况下,这是两个不同的实例,显然不一样)。

另请参阅Overriding Object.equals VS Overloading it


顺便说一句:第二种实现不太正确,因为它假定传入的circle参数始终为Circle类型。在您问题的简并代码示例中,这是正确的,但在实际程序中,通常是不正确的。正确实现equals(Object)会首先检查参数的类型,如果类型不正确,则立即返回false