在Java的继承体系中,子类会自动继承父类的非私有属性和方法,但如果子类中定义了和父类同名的成员,或者需要显式调用父类的构造方法,就需要通过super关键字来访问父类的成员。下面我们就详细介绍super关键字的使用方式。

super关键字的基本概念
super关键字是Java中用来引用父类对象的引用变量,它可以访问父类中被子类隐藏或覆盖的成员,也可以调用父类的构造方法。和this关键字指向当前对象不同,super指向的是当前对象的父类部分。
使用super访问父类成员变量
当子类中定义了和父类同名的成员变量时,父类的该变量会被隐藏,此时通过子类对象直接访问的是子类的变量,如果要访问父类的同名变量,就需要用super.变量名的方式。
class Parent {
// 父类成员变量
String name = "父类名称";
int age = 40;
}
class Child extends Parent {
// 子类同名成员变量,隐藏父类name
String name = "子类名称";
int age = 18;
public void printInfo() {
// 访问子类自己的成员变量
System.out.println("子类name:" + name);
System.out.println("子类age:" + age);
// 通过super访问父类的成员变量
System.out.println("父类name:" + super.name);
System.out.println("父类age:" + super.age);
}
}
public class SuperVariableDemo {
public static void main(String[] args) {
Child child = new Child();
child.printInfo();
}
}使用super访问父类方法
如果子类重写了父类的方法,那么通过子类对象调用该方法时会执行子类的实现,若要调用父类被重写的方法,就需要使用super.方法名()的语法。
class Parent {
public void showInfo() {
System.out.println("这是父类的方法");
}
public void parentOnlyMethod() {
System.out.println("这是父类独有的方法");
}
}
class Child extends Parent {
// 重写父类的showInfo方法
@Override
public void showInfo() {
System.out.println("这是子类重写后的方法");
}
public void test() {
// 调用子类自己重写的方法
showInfo();
// 通过super调用父类被重写的方法
super.showInfo();
// 调用父类独有的方法,也可以用super,也可以直接调用(因为没被重写)
super.parentOnlyMethod();
}
}
public class SuperMethodDemo {
public static void main(String[] args) {
Child child = new Child();
child.test();
}
}使用super访问父类构造方法
子类的构造方法中,默认会隐式调用父类的无参构造方法,如果需要显式调用父类的构造方法(尤其是有参构造),就需要在子类构造方法的第一行使用super(参数列表)的语法。
class Parent {
private String name;
private int age;
// 父类无参构造
public Parent() {
System.out.println("父类无参构造执行");
}
// 父类有参构造
public Parent(String name, int age) {
this.name = name;
this.age = age;
System.out.println("父类有参构造执行,name:" + name + ",age:" + age);
}
}
class Child extends Parent {
private String hobby;
// 子类无参构造,隐式调用父类无参构造
public Child() {
// 这里默认有super(),可以省略
System.out.println("子类无参构造执行");
}
// 子类有参构造,显式调用父类有参构造
public Child(String name, int age, String hobby) {
// 必须放在第一行
super(name, age);
this.hobby = hobby;
System.out.println("子类有参构造执行,hobby:" + hobby);
}
}
public class SuperConstructorDemo {
public static void main(String[] args) {
System.out.println("=== 创建子类无参对象 ===");
Child c1 = new Child();
System.out.println("\n=== 创建子类有参对象 ===");
Child c2 = new Child("张三", 20, "篮球");
}
}使用super的注意事项
- super关键字不能在静态方法中使用,因为静态方法属于类,不依赖于对象,而super指向的是父类对象部分。
- 调用父类构造方法的super语句必须放在子类构造方法的第一行,否则会编译报错。
- 如果父类没有无参构造方法,子类构造方法中必须显式调用父类的有参构造,否则编译不通过。
- super只能访问父类中非私有的成员,父类的private成员无法被super直接访问。
总结:super关键字是Java继承体系中访问父类成员的重要工具,正确掌握它的用法,能帮助我们更灵活地处理子类与父类的成员交互,写出更清晰的继承相关代码。