Java中static方法不能被重写,因其绑定在编译期、依赖声明类型而非实际类型,使用invokestatic指令且不进虚方法表;子类同名static方法属于隐藏而非重写,二者并存互不影响,@Override注解不适用。

不能。Java 中 static 方法不能被重写(override),子类中定义同名同参数的 static 方法,属于方法隐藏(hiding),不是重写。
为什么 static 方法不能被重写
重写是面向对象多态的核心机制,依赖运行时动态绑定(通过 invokevirtual 指令查虚方法表)。而 static 方法在编译期就确定调用目标(使用 invokestatic 指令),不依赖对象实例,也不进入虚方法表——它根本不在多态体系内。
- 调用哪个
static方法,只看引用变量的声明类型,不看实际创建的对象类型 - 例如:
Parent p = new Child(); p.method();调用的是Parent.method() - 即使子类写了同签名
static方法,父类方法依然存在且可直接通过Parent.method()访问
子类写同名 static 方法会发生什么
这是方法隐藏,不是覆盖。两个方法并存,互不影响:
-
Parent.method()→ 执行父类版本 -
Child.method()→ 执行子类版本 -
Parent p = new Child(); p.method();→ 仍执行父类版本 - 子类方法访问权限可以不同(但父类
private static不可被隐藏)
@Override 注解加在 static 方法上会怎样
编译直接失败,报错:
method does not override or implement a method from a supertype
立即学习“Java免费学习笔记(深入)”;
- 这说明 Java 语言层面明确拒绝将
static方法视为可重写目标 - 只有实例方法(非
private、非final)才能使用@Override - 如果误加,IDE 或 javac 都会立刻提示,不会等到运行时
接口中的 static 方法能被实现类重写吗
也不能。接口 static 方法是接口自身的工具函数,仅能通过接口名调用(如 MyInterface.doWork()):
- 实现类无法继承该方法,更不能重写
- 实现类若定义同签名
static方法,只是独立的新方法,与接口无关 - 设计初衷是提供稳定、统一的辅助逻辑(如校验、构造),不随实现类变化
- 需要可变行为,应使用
default方法或实例方法


















