Java多态理解疑问:父类引用调用方法为何匹配Object参数?
Java方法调用:父类引用为何匹配重写的Object参数方法?
先看你的代码场景:
interface Parent { public String name(Object b); } class Child implements Parent { public String name(Object b) { return [???]; } public String name(String b) { return "Child " + [???]; } } public class Exercise { public static void main(String[] args) { Parent p = new Child(); assert p.name("String").equals("Child String"); } }
你疑惑的核心点:明明传的是String类型参数,为什么p.name("String")调用的是Child里重写的name(Object),而不是重载的name(String)?
关键逻辑:编译时绑定方法签名,运行时找重写实现
Java里的方法调用分两步:
- 编译阶段:编译器只认变量的引用类型,这里
p是Parent类型,而Parent接口里只有一个方法:name(Object)。所以编译器会把你传入的String参数自动向上转型为Object,绑定到name(Object)这个方法签名上——编译时编译器不知道p实际指向Child对象,只会依据Parent的定义来匹配方法。 - 运行阶段:JVM会根据实际对象类型(
Child),找name(Object)方法的重写实现,也就是Child里的public String name(Object b),所以最终执行的是这个方法。
而Child里的name(String)是重载方法,重载是编译时确定的,编译阶段已经绑定了name(Object),所以运行时不会触发这个重载方法。
满足断言的填充方式
要让p.name("String").equals("Child String")成立,只需要让Child中重写的name(Object b)返回"Child String"即可,所以第一个[???]填"Child String";第二个[???]对应的方法不会被调用,填任意值都不影响(比如填b也可以,但实际没用)。
内容的提问来源于stack exchange,提问作者MagicKoyFish
相关产品推荐
相关产品推荐

