在 java 中,super 关键字主要用于在子类中访问父类的成员变量、方法或构造器。具体做法包括:使用 super.variable 访问被隐藏的父类字段,使用 super.method() 调用被子类重写的方法,以及在子类的构造方法第一行通过 super(args) 显式调用父类构造器以完成初始化。

子类如何访问被隐藏的父类成员变量
当子类定义了与父类同名的成员变量时,父类的该变量会被隐藏。此时直接使用变量名会访问子类的版本,而使用 super.variableName 则可以明确获取父类中的值。这在需要保留父类状态或进行增量计算时非常有用。

public class Parent {
int value = 10;
}
public class Child extends Parent {
int value = 20;
public void printValues() {
System.out.println("Child value: " + this.value); // 输出 20
System.out.println("Parent value: " + super.value); // 输出 10
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.printValues();
}
}
子类如何调用被子类重写的方法
如果子类重写了父类的方法,直接调用方法名将执行子类的实现。若需要在子类方法中复用父类的原始逻辑,可以使用 super.methodName()。这通常用于在扩展功能的同时保留基础行为,例如在日志记录或权限检查中。

public class Animal {
public void speak() {
System.out.println("Animal makes a sound");
}
}
public class Dog extends Animal {
@Override
public void speak() {
super.speak(); // 调用父类方法
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.speak();
}
}
子类构造器中如何显式调用父类构造器
在创建子类对象时,必须首先初始化父类部分。Java 默认会在子类构造器的第一行隐式调用父类的无参构造器 super()。如果父类没有无参构造器,或者需要传递特定参数给父类,则必须在子类构造器第一行显式使用 super(args)。注意,super() 调用必须是构造器中的第一条语句,且不能与 this() 同时出现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











