Java 对象的equals方法?

Java 对象的equals方法?,java,equals,Java,Equals,有人能解释为什么第一个代码等于false,第二个代码等于true吗? Java中的所有对象都以基本对象类中的equalsObject方法开始。您的第二个示例只是覆盖此方法,因此,无论何时调用equalsObject方法,都将使用覆盖实现,而不是基本实现 但是,在第一个示例中,您为equals方法添加了一个新的重载,其参数列表与based Object.equals方法不同。当这两种情况都为真时,可以随时调用此重载: 用于调用该方法的引用的编译时类型为Circle,并且 传递给方法的参数的编译时

有人能解释为什么第一个代码等于false,第二个代码等于true吗?


Java中的所有对象都以基本对象类中的equalsObject方法开始。您的第二个示例只是覆盖此方法,因此,无论何时调用equalsObject方法,都将使用覆盖实现,而不是基本实现

但是,在第一个示例中,您为equals方法添加了一个新的重载,其参数列表与based Object.equals方法不同。当这两种情况都为真时,可以随时调用此重载:

用于调用该方法的引用的编译时类型为Circle,并且 传递给方法的参数的编译时类型为Circle 第一个条件是必需的,这样编译器就可以首先找到方法。如果调用的目标实例的编译时类型不是Circle,那么该方法的equalsCircle重载甚至不会被认为是可能的

第二个条件是必需的,这样编译器就可以将equalsCircle重载识别为要调用的重载。如果在编译时不知道要传递的参数是Circle,那么编译器就不能安全地使用equalsCircle方法,而必须选择equalsObject重载

在第一个示例中,方法调用的目标实例以及传递给方法的参数的编译时类型都是Object而不是Circle。因此,编译器没有安全的方法调用equalsCircle重载,而必须调用equalsObject。这个重载(基本实现)只是比较两个对象的引用,只有当它们相同时才返回true,而在本例中,两个不同的实例显然不相同

另见


旁白:第二个实现并不完全正确,因为它假定传入的circle参数始终是circle类型。这在您问题中的退化代码示例中是正确的,但在实际程序中通常不正确。equalsObject的正确实现将首先检查参数的类型,如果类型不正确,则立即返回false。

请添加语言标记,并键入代码,因为没有人调用Circle.equalsCircle。不要在这里张贴文字图片。张贴文本。完全浪费你的时间和我们的带宽。