有人可以解释为什么第一个代码等于false,第二个代码等于true吗?
答案 0 :(得分:0)
Java中的所有对象均以equals(Object)
基类中的Object
方法开头。您的第二个示例只是覆盖了此方法,因此,每次调用equals(Object)
方法时,都会使用覆盖实现,而不是基本实现。
但是,在第一个示例中,您为equals()
方法添加了 new 重载,其参数列表与基于Object.equals()
的方法不同。当这两个都成立时,只要您调用它,就会使用此重载:
Circle
,并且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
。