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

重写静态方法结果不符合预期?Java父类引用调用静态方法输出A而非B原因

首先明确核心结论:你对静态方法的机制理解有误,Java 里静态方法根本不支持重写,你做的操作叫方法隐藏,和实例方法的重写逻辑完全不同。

静态方法是绑定到类本身的,不属于任何实例对象,调用的时候只看变量的声明类型,和变量实际指向的对象类型没有关系。你代码里的object声明类型是A,哪怕你new的是B类的实例,调用object.foo()的时候JVM只会识别到声明的A类,自然执行的是A类的foo()输出"A"。

这里还有个不规范的点:用实例对象调用静态方法是非常不推荐的写法,编译器一般都会给警告,就是因为这种写法容易混淆类方法和实例方法的边界,导致你遇到的这种误解。静态方法正确的调用方式是直接用类名调用:

A.foo(); // 输出A
B.foo(); // 输出B

两者的核心差异可以总结为:

  • 实例方法重写:运行时动态绑定,根据实际运行的对象类型决定调用哪个方法,支持多态
  • 静态方法隐藏:编译期就确定了调用目标,只根据变量的声明类类型决定,不支持多态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:27:00