3 回答

TA贡献1810条经验 获得超5个赞
Java对重载方法使用静态绑定,而对重载方法使用动态绑定。在您的示例中,equals方法被重载(与Object.equals()具有不同的参数类型),因此所调用的方法在编译时绑定到引用类型。
这里一些讨论
它是equals方法的事实并不重要,除了重载而不是覆盖它是一个常见错误之外,您已经根据面试中对问题的答案意识到了这一点。
编辑:这里也是一个很好的描述。本示例显示了与参数类型有关的类似问题,但是是由同一问题引起的。
我相信,如果绑定实际上是动态的,则在任何情况下调用方和参数都是Test实例的情况都将导致调用重写的方法。因此,t3.equals(o1)将是唯一无法打印的情况。

TA贡献1824条经验 获得超5个赞
的equals
方法Test
不会覆盖的equals
方法java.lang.Object
。看参数类型!所述Test
类被重载equals
用一个接受的方法Test
。
如果equals
要覆盖该方法,则应使用@Override批注。这将导致编译错误指出此常见错误。

TA贡献1852条经验 获得超1个赞
有趣的是,在Groovy代码(可以将其编译为类文件)中,除一个调用外,所有调用都将执行print语句。(将测试与对象进行比较的人显然不会调用Test.equals(Test)函数。)这是因为Groovy DOES完全进行了动态类型化。这是特别令人感兴趣的,因为它没有任何显式动态键入的变量。我已经在几个地方读到了这被认为是有害的,因为程序员期望使用groovy来完成Java任务。
添加回答
举报