静态方法不能被@override重写,因其在编译期绑定、不参与多态,调用取决于声明类型而非实际类型;子类同名静态方法属于方法隐藏,与父类方法共存,本质是作用域遮蔽而非面向对象覆盖。

因为静态方法在编译期就绑定目标,不参与运行时多态机制,所以不能被 @Override 重写。
静态方法调用靠编译期类型决定
静态方法的调用依据是引用变量的声明类型,而不是实际指向的对象类型。比如:
-
Parent p = new Child(); p.show();→ 调用的是Parent.show() -
Child c = new Child(); c.show();→ 调用的是Child.show()
这种“看左边、不看右边”的行为,是编译器在编译时就确定的(invokestatic 指令),和实例方法的动态绑定(invokevirtual)完全不同。
@Override 注解会直接编译失败
给子类静态方法加上 @Override,编译器会报错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
这不是警告,而是明确拒绝——它告诉你:这不是重写,也不是实现接口,默认就不允许加这个注解。
- 只有实例方法才能被
@Override - 加了却通过?说明父类对应方法也是
static,那只是隐藏(hiding),不是重写
子类同名 static 方法是“隐藏”,不是“覆盖”
子类定义一个签名相同的 public static void show(),并不会替换父类方法,而是让该方法名在子类作用域中指向新实现:
-
Parent.show()仍可调用,输出父类逻辑 -
Child.show()调用子类逻辑 - 两者共存、互不干扰,访问权限可以不同(但父类
private static不可被隐藏)
这种机制叫方法隐藏(method hiding),本质是作用域层面的名称遮蔽,不是面向对象意义上的行为继承。
设计意图:静态方法是类级工具,不是对象行为
像 Math.abs()、Collections.sort() 这类方法,不依赖任何实例状态,语义必须稳定、可预测:
- 如果允许重写,
Math.abs(-5)的含义可能因继承链变化,破坏工具函数的可靠性 - 禁止重写避免模糊“类功能”与“对象行为”的边界
- 省去运行时方法表(vtable)查找,提升调用性能
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










