重写静态方法结果不符合预期?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
相关产品推荐
相关产品推荐

