java中不存在静态方法重写,只有方法隐藏;静态方法调用依据声明类型静态绑定,实例方法才通过vtable动态绑定实现多态,@override加在静态方法上会编译失败。

Java 中不存在“静态方法重写”,只有“方法隐藏”。这个误区的根源在于:表面写法相似,但底层机制和运行结果完全不同。关键不是看代码长得像不像,而是看调用时依据什么、绑定发生在哪一阶段。
静态方法调用只看左边声明类型
变量怎么声明的,就调哪个类的静态方法,和右边 new 的是什么对象毫无关系。
- Parent p = new Child(); p.staticMethod(); → 执行 Parent.staticMethod()
- Child c = new Child(); c.staticMethod(); → 执行 Child.staticMethod()
- 哪怕把 p 强转成 ((Child)p).staticMethod(),也只改变编译期类型,调用的是 Child 版本——但这仍是静态绑定,不是多态
实例方法重写才真正依赖右边实际类型
只要父类引用指向子类实例,且方法是实例方法、非 private、可被继承,就会执行子类重写后的行为。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- Parent p = new Child(); p.instanceMethod(); → 执行 Child.instanceMethod()
- 这个过程由 JVM 在运行时查虚方法表(vtable)决定,是动态绑定
- 而静态方法用的是 invokestatic 指令,目标类在字节码里已写死,不进 vtable
@Override 注解是快速验证工具
它不会骗你:加在静态方法上,编译直接失败。
- 报错信息明确:method does not override or implement a method from a supertype
- 说明编译器清楚告诉你:这不是重写,连重写的资格都没有
- 如果误从实例方法复制粘贴后改成 static 却忘了删 @Override,这就是典型信号
隐藏 ≠ 覆盖,父类方法始终可用
子类定义同签名静态方法,只是让该名称在子类作用域中指向自己的实现;父类方法并未消失。
- Parent.staticMethod() 依然可以正常调用
- Child.staticMethod() 是独立存在的新方法,与父类无覆盖关系
- 两者互不影响,也不受 final 限制(隐藏不被 final 阻止)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










