super用于访问被隐藏的父类字段,因字段无多态性,子类同名字段与父类字段独立存在;实例变量需在非静态方法中用super.变量名访问,静态变量虽可用super.type但推荐Parent.type。

在 Java 继承中,子类定义了与父类同名的字段(实例变量或静态变量)时,会“隐藏”(shadow)父类的同名变量,而不是覆盖它。此时,可以用 super 关键字显式访问被隐藏的父类变量。
为什么需要 super 访问被隐藏的变量
字段不具有多态性,Java 中只有方法才支持动态绑定和重写。当子类声明了和父类同名的字段,两个字段各自独立存在,子类对象中实际同时持有父类和子类的同名字段(内存中是两个不同的存储位置)。直接用变量名访问的是子类自己的字段;要读取或修改父类那份,就必须用 super.变量名。
访问被隐藏的实例变量
在子类的非静态方法中,通过 super.变量名 可以访问父类中被隐藏的实例变量:
class Parent {
String name = "Parent";
}
class Child extends Parent {
String name = "Child";
void printNames() {
System.out.println(name); // 输出 "Child"(子类变量)
System.out.println(super.name); // 输出 "Parent"(父类变量)
}
}
-
super.name明确指向父类声明的name字段 - 不能在静态上下文(如静态方法、静态块)中使用
super访问实例变量 - 若父类字段是
private,即使同名,子类也无法通过super直接访问(编译错误),因为私有字段不可见
访问被隐藏的静态变量
静态变量也能被隐藏(不是重写),同样可用 super 访问父类的静态变量:
class Parent {
static String type = "ParentType";
}
class Child extends Parent {
static String type = "ChildType";
static void showTypes() {
System.out.println(type); // 输出 "ChildType"
System.out.println(super.type); // 输出 "ParentType"
}
}
-
super.type在子类静态方法中合法,且能访问父类静态字段 - 注意:虽然语法允许,但静态成员本质上属于类而非对象,用
super访问静态变量容易引起误解,推荐用类名直接引用(如Parent.type)更清晰
常见误区与注意事项
避免把字段隐藏误当成方法重写;也别混淆 super 和 this 的作用范围:
-
super只能用于访问直接父类的成员(不能跨代),且仅限于可访问权限范围内(public/protected/包内默认) - 构造器中
super()是调用父类构造器,与访问变量无关;变量访问必须在方法或初始化块中进行 - 如果父类字段是
final,super.字段名只能读取,不能赋值(除非在子类构造器中通过super(…)传参初始化)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











