Skip to content

super关键字

super关键字代表的是当前对象中的父类特征

  • super与this一样,不能在静态上下文中使用

  • this可以单独输出,super无法单独输出,因为你无法确定你的父类是谁。

  • 当父类和子类中定义了相同的属性或方法时,如果需要在子类中访问父类的属性或方法时,super不能省略

访问父类属性

当子类和父类有 同名变量 时,可以使用 super 访问父类变量。

java
class Person {
    String name = "父类Person";
}

class Student extends Person {
    String name = "子类Student";

    void printName() {
        System.out.println(name);       // 子类变量
        System.out.println(super.name); // 父类变量
    }
}

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.printName();
    }
}
java
子类Student
父类Person

调用父类方法

如果子类 重写了父类方法,但是只是在父类原有的方法上添加扩展,我们可以使用super调用父类中重写的方法

java
class Person {
    void eat() {
        System.out.println("人吃饭");
    }
}

class Student extends Person {

    void eat() {
        super.eat()
        System.out.println("学生吃完饭将餐盘放到回收处");
    }
}

在IDEA中,我们重写父类xxx方法时,它默认会生成:super.xxx()。确保我们就算什么也没写,程序也能正常运行

java
class Student extends Person {

    @Override
    void eat() {
        super.eat()
    }
}

调用父类构造函数

子类构造方法中可以使用 super() 调用父类构造方法。

java
class Person {

    Person() {
        System.out.println("Person构造方法");
    }
}

class Student extends Person {

    Student() {
        super(); // 调用父类构造方法
        System.out.println("Student构造方法");
    }
}

public class Test {
    public static void main(String[] args) {
        new Student();
    }
}
java
Person构造方法
Student构造方法
  • super() 必须写在构造方法第一行

  • 如果不写,Java 默认会自动调用 super()

  • 传入指定形参列,我们调用指定的父类构造方法


子类为什么要默认调用父类的构造函数?

父类的成员必须先初始化,子类对象才能完整创建。创建子类对象时,必须先把父类那一部分对象构造出来。因为 子类对象本质上包含一部分父类对象

java
class Person {
    
    String name

    Person() {
        System.out.println("Person构造");
    }
}

class Student extends Person {
	String name
        
    int age
        
    Student(name,age) {
        this.name=name;
        this.age=age;
        System.out.println("Student构造");
    }
}

public class Test {
    public static void main(String[] args) {
        new Student('zs');
    }
}
Person构造
Student构造
super.name=null
this.name=zs
age

调用父类的构造函数是为了给继承过来的父类型特性初始化