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

Java多态与静态绑定疑问:方法重载调用结果困惑

关于Java多态、重载与绑定的问题解析

首先得明确两个核心逻辑:方法重载是编译期静态绑定,编译器会先根据调用时参数的编译期类型,找到最匹配的方法签名;而方法重写才是运行期动态绑定,根据实际对象类型找具体实现。

咱们一步步拆解你代码里的c.foo(c)调用:

  1. 编译期确定方法签名:
    • 调用时参数c的编译期类型是C,编译器先在C类里找参数为C的foo方法——显然找不到。
    • 接下来会按继承层级从近到远找匹配的参数类型:C的直接父类是B,父类B里刚好有foo(B a),而C作为B的子类,实例可以向上转型为B类型。因为B比A的层级更靠近C、更具体,所以编译器会优先选中foo(B a)这个方法签名,而非C类里的foo(A a)。
  2. 运行期动态绑定实现:
    • 确定方法签名后,JVM会检查实际对象(C实例)有没有重写foo(B a)。你的C类并没有实现这个方法,所以会向上调用父类B里的foo(B a),最终输出"BBBBB"。

你之前的误区在于,误以为找不到完全匹配的参数时会直接匹配最顶层父类的参数,但编译器的重载匹配逻辑是优先选择最具体的、与参数类型继承关系最近的方法,所以才会出现这样的结果。

内容的提问来源于stack exchange,提问作者empty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:52:16