Java静态方法不能被重写,只能被隐藏;调用时依据编译时类型(引用类型)而非运行时对象类型,故Parent p = new Child(); p.staticMethod()执行Parent版本,不具多态性。

Java 中的静态方法不能被重写,只能被隐藏;这种“隐藏”机制正是理解其非多态行为的关键入口。
静态方法调用由编译时类型决定
静态方法绑定发生在编译期,不依赖对象实际类型。哪怕父类引用指向子类实例,调用的仍是父类的静态方法。
-
Animal a = new Cat(); a.test(); → 执行
Animal.test() -
Cat c = new Cat(); c.test(); → 执行
Cat.test() - 根本原因:JVM 查找静态方法时,看的是变量声明类型(即“左边是什么类”),不是 new 后面的实际类型
隐藏 ≠ 重写,没有运行时分派
子类定义同签名静态方法,不会触发动态绑定,也不受多态影响。它只是让子类自己的版本在通过子类名或子类引用调用时“可见”,但两者彼此独立。
- 父类和子类的静态方法在字节码中是两个完全不同的符号,无继承关系
-
@Override注解无法用于静态方法——IDE 会报错,这是最直接的识别信号 - 若误将父类实例方法改为 static,或反之,编译器会警告:“method does not override or hide a method from a supertype”
字段隐藏与静态方法隐藏逻辑一致
字段(无论 static 还是实例)也遵循“看引用类型”的规则,这进一步印证了 Java 对静态成员和字段统一采用编译期绑定的设计哲学。
立即学习“Java免费学习笔记(深入)”;
- Animal a = new Cat(); System.out.println(a.name); → 输出父类字段值
- Cat c = new Cat(); System.out.println(c.name); → 输出子类字段值
- 字段和静态方法都不参与运行时方法表(vtable)查找,它们天然排斥多态
如何安全访问被隐藏的父类静态方法
子类中若需明确调用父类版本,必须显式使用父类名,而非 this 或 super(super 不适用于静态上下文)。
- ✅ 正确:
Animal.test(); - ❌ 错误:
super.test();(编译失败) - ❌ 错误:
this.test();(实际调用的是当前类的静态方法,非父类) - 子类内部如需复用父类逻辑,应封装为工具方法,避免依赖隐藏机制做业务判断


















