静态方法被子类同名方法“隐藏”而非重写,调用取决于编译期引用类型或显式类名;Parent.test()和Child.test()可精准调用对应版本;@Override注解编译失败可快速验证是否为隐藏。

父类静态方法在继承中被子类同名静态方法“隐藏”,不是重写,调用时完全看编译期的引用类型或显式使用的类名。想明确调用哪个版本,关键不是靠对象,而是靠类名本身。
直接用类名调用是最清晰的方式
无论变量声明类型如何,只要写明类名,就能精准定位到对应类的静态方法:
- Parent.test() → 一定执行父类的 test(),哪怕当前对象是 Child 实例
- Child.test() → 一定执行子类的 test(),哪怕变量声明为 Parent 类型
- new Child().test() 这种写法不可靠——实际调用取决于左侧引用类型,不是 new 后面的类
避免依赖变量声明类型来判断
用变量调用静态方法容易误判,因为结果由声明类型决定,和实际对象无关:
- Parent p = new Child(); p.test(); → 调用 Parent.test()
- Child c = new Child(); c.test(); → 调用 Child.test()
- 同一对象,换不同声明类型,调用结果就不同。所以别指望“p 是 Child 实例”就能触发子类逻辑
子类内部调用父类静态方法只能写类名
在子类的方法里,不能用 super 或 this 来安全访问父类静态方法:
- super.test() → 编译错误:super 不适用于静态上下文
- this.test() → 实际调用的是子类自己的 test(),不是父类的
- Parent.test() → 唯一正确、无歧义的写法
用 @Override 检验是否属于隐藏
这是快速识别“隐藏”而非“重写”的最简单手段:
- 给子类静态方法加上 @Override 注解 → 编译失败,提示 “does not override or hide”
- 编译通过且没报错,说明它要么是合法隐藏(签名一致),要么只是个新方法(签名不一致)
- 这个检查比运行看输出更早、更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











