Java多态与静态绑定疑问:方法重载调用结果困惑
关于Java多态、重载与绑定的问题解析
首先得明确两个核心逻辑:方法重载是编译期静态绑定,编译器会先根据调用时参数的编译期类型,找到最匹配的方法签名;而方法重写才是运行期动态绑定,根据实际对象类型找具体实现。
咱们一步步拆解你代码里的c.foo(c)调用:
- 编译期确定方法签名:
- 调用时参数
c的编译期类型是C,编译器先在C类里找参数为C的foo方法——显然找不到。 - 接下来会按继承层级从近到远找匹配的参数类型:
C的直接父类是B,父类B里刚好有foo(B a),而C作为B的子类,实例可以向上转型为B类型。因为B比A的层级更靠近C、更具体,所以编译器会优先选中foo(B a)这个方法签名,而非C类里的foo(A a)。
- 调用时参数
- 运行期动态绑定实现:
- 确定方法签名后,JVM会检查实际对象(
C实例)有没有重写foo(B a)。你的C类并没有实现这个方法,所以会向上调用父类B里的foo(B a),最终输出"BBBBB"。
- 确定方法签名后,JVM会检查实际对象(
你之前的误区在于,误以为找不到完全匹配的参数时会直接匹配最顶层父类的参数,但编译器的重载匹配逻辑是优先选择最具体的、与参数类型继承关系最近的方法,所以才会出现这样的结果。
内容的提问来源于stack exchange,提问作者empty
相关产品推荐
相关产品推荐

