Java中静态方法不能被重写,只能被隐藏;其调用在编译期依据引用变量的声明类型决定,不参与多态,与实例方法的动态绑定本质不同。

Java 中静态方法不能被重写(override),只能被隐藏(hide)。
静态方法不参与多态
静态方法的调用在编译期就确定了,依据的是引用变量的声明类型,而不是运行时实际对象的类型。这与实例方法的动态绑定(运行时决定调用哪个子类实现)完全不同。
- 父类定义
static void show(),子类也定义同签名的static void show() - 即使通过子类实例调用,如
Parent p = new Child(); p.show();,执行的仍是Parent.show() - 只有明确用
Child.show()才会调用子类的版本
子类中同名静态方法是“隐藏”,不是“重写”
子类中定义与父类相同签名的静态方法时,JVM 不会将其视为重写,而是视为独立的、属于子类自己的静态方法。父类的静态方法依然存在,只是被“遮蔽”了。
- 不会触发动态分派,没有 @Override 注解支持(加了会编译错误)
- 两个方法各自独立,内存中都存在,可通过类名直接访问
- 例如:
Parent.show()和Child.show()可同时调用且行为不同
如何验证静态方法未被重写
一个简单测试方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 在父类和子类中分别打印所属类名(如
System.out.println("Parent static")) - 用父类引用指向子类对象后调用该静态方法,输出仍是父类信息
- 对比同场景下实例方法:用同样引用调用非 static 方法,输出是子类信息
替代方案:若需类似重写的效果
如果业务逻辑需要根据实际类型执行不同行为,应改用实例方法 + 多态机制:
- 将逻辑移到非 static 方法中,由子类 override 实现差异化
- 静态方法内部可调用该实例方法(如工厂模式中用 static 创建对象,再委托给实例处理)
- 避免在静态方法中硬编码类型判断(如
if (obj instanceof Child)),破坏可扩展性
不复杂但容易忽略:记住“静态绑定看声明类型,动态绑定看实际类型”。

















