java中static方法不能被重写,因其不参与多态:调用由编译期声明类型决定,使用invokestatic指令且不进虚方法表;子类同名static方法仅为隐藏,非重写,二者互不影响。

Java中static方法不能被重写,是因为它根本不在面向对象的多态体系内——它不依赖对象实例,也不参与运行时动态分派。
静态方法调用看声明类型,不是实际类型
调用哪个static方法,在编译期就由变量的**声明类型**决定,和new出来的是什么对象完全无关。
-
Parent p = new Child(); p.show();→ 执行Parent.show() -
Child c = new Child(); c.show();→ 执行Child.show() - 哪怕把
p强转成((Child)p).show(),也只改变编译期类型,调用Child.show()
重写依赖虚方法表,静态方法不进虚表
实例方法重写生效,靠JVM运行时查对象真实类型的虚方法表(vtable);而static方法用的是invokestatic指令,目标类在字节码里已写死。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 没有运行时查找,就没有动态绑定基础
- 不进vtable,不走
invokevirtual,自然无法被重写 -
@Override加在static方法上会直接编译失败
隐藏是作用域覆盖,不是行为继承
子类定义同签名static方法,只是让该方法名在子类作用域中指向自己的实现;父类方法依然存在,且可通过Parent.show()直接调用。
- 两者互不影响,可同时访问
- 访问权限不要求一致(但
private父类方法不可被子类“隐藏”) - 若子类去掉
static或父类去掉static,编译直接报错——说明它们不属于同一机制
设计意图:静态方法是类级工具,不是对象行为
像Math.abs()、Collections.sort()这类方法,不依赖实例状态,也不该因继承关系改变语义。
- 允许重写会模糊“类功能”与“实例行为”的边界
- 禁止重写既保证语义清晰,又避免运行时查找开销
- 真需要可变逻辑,应改用实例方法 + 抽象类或接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










