java形参和实参类型不一致

288 阅读1分钟

在ArrayList源码中,在indexOfRange方法(jdk11中indexOfRange被indexOf调用再被contains调用)里我ctrl+左键点击331行equals方法

1.png

结果跳到了Object类的equals方法,很显然他的形参类型是Object所以跳到了Object类中,但是很多时候我们的实参类型都不为Object,比如为String类,那么他会跳到String类重写的equals方法吗?如果不跳String中,那么contains方法就无法比较容器中是否有这种字符串。于是我写一个测试类DEBUG看他会到哪

5.png

3.png 结果到了String类中,虽然o是一个Object对象,但他是String实例化的,所以调用了String重写的equals方法,但是不能调用String中有Object没有的方法(多态)。

所以我在阅读源码或写自己代码只靠ctrl+左键进入调用的方法不一定对,因为形参类型或实参类型可能不一致,如要确认正确调用的方法是什么,可在具体的例子中DEBUG查看调用方法。