You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:22:12