静态方法调用由变量声明类型决定,属编译期绑定,不依赖实际对象类型;子类同名静态方法只能隐藏父类方法,不能重写,加@Override会编译报错。

调用结果完全由变量声明的类型(即编译时类型)决定,和实际创建的对象类型无关。
看引用类型,不是看 new 的是谁
Java 在编译阶段就确定静态方法调用目标,不查运行时对象。只要变量声明是父类类型,哪怕右边 new 的是子类实例,也调用父类的静态方法。
- Parent p = new Child(); p.method(); → 调用 Parent.method()
- Child c = new Child(); c.method(); → 调用 Child.method()
- Parent p2 = new Parent(); p2.method(); → 调用 Parent.method()
@Override 注解会直接报错
这是最快速、最可靠的判断方式:如果给静态方法加 @Override,编译器立刻提示“method does not override or hide...”,说明它不是重写,只能是隐藏(或根本无关)。
- 合法隐藏:子类 static 方法签名与父类完全一致,无 @Override
- 非法写法:加了 @Override → 编译失败
- 签名不一致(如参数不同、返回类型不同)→ 不构成隐藏,只是新增一个独立方法
字段访问规则一致,可辅助验证
静态方法隐藏和字段隐藏共享同一套绑定逻辑:都看引用类型,都属编译期绑定。若发现字段访问也表现出“父类引用输出父类值”,基本可确认当前上下文是静态绑定场景。
立即学习“Java免费学习笔记(深入)”;
- Parent p = new Child(); System.out.println(p.name); → 输出 Parent.name
- Child c = new Child(); System.out.println(c.name); → 输出 Child.name
- 这种一致性说明 Java 对 static 成员和字段统一采用“引用类型优先”策略
想调父类版本,必须显式用类名
在子类内部无法用 super 或 this 安全调用父类静态方法——super.test() 编译失败,this.test() 实际调的是子类自己的版本。
- ✅ 正确写法:Parent.test()
- ❌ super.test() → 编译错误
- ❌ this.test() → 调用当前类(子类)的 test()


















