Java中静态成员同名时发生隐藏而非重写,访问父类静态成员必须用“父类名.成员”形式,super不适用;静态方法调用由编译期引用类型决定,不具多态性。

在 Java 中,当子类定义了与父类同名的 静态成员变量 或 静态方法 时,会发生“隐藏(hiding)”,而非“重写(overriding)”。此时子类成员会遮蔽父类同名成员。要访问被隐藏的父类成员,需明确指定作用域。
访问被隐藏的父类静态成员变量
使用 父类名.静态变量名 的形式直接访问,不能用 super(因为 super 不适用于静态上下文)。
- ✅ 正确:
Parent.staticField - ❌ 错误:
super.staticField(编译报错) - ⚠️ 注意:即使通过子类实例调用,如
new Child().staticField,实际访问的仍是子类版本;必须显式用父类名限定
访问被隐藏的父类静态方法
同样使用 父类名.静态方法名() 调用。静态方法不参与多态,调用目标由引用类型(或类名)在编译期决定。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ✅ 正确:
Parent.staticMethod() - ❌ 错误:
super.staticMethod()(语法非法) - ? 提示:若子类中该静态方法仅做简单转发,可主动在子类里提供一个非静态的包装方法,内部调用
Parent.staticMethod()
区分隐藏和重写,避免误用 super
super 关键字只适用于访问 被重写的实例方法 和 父类的实例变量(且未被子类同名变量遮蔽时),对静态成员无效。
立即学习“Java免费学习笔记(深入)”;
- 实例方法重写 → 可用
super.method() - 静态方法/变量隐藏 → 必须用
父类名.成员 - 子类中声明了同名实例变量 → 实例中可用
super.field访问父类版本(前提是未被 private 修饰)
实际例子快速验证
假设父类 Parent 和子类 Child 均定义了 public static String TAG = "Parent" 和 public static void show() { ... }:
-
System.out.println(Parent.TAG);→ 输出"Parent" -
System.out.println(Child.TAG);→ 输出"Child"(子类值) -
Parent.show();→ 执行父类静态方法 -
Child.show();→ 执行子类静态方法

















