Java super关键字:继承中的父类调用,必学

在Java中,当我们创建子类对象时,子类会继承父类的所有非私有成员(成员变量和成员方法)。但有时候,我们需要明确地调用父类的构造方法、成员变量或成员方法,这时候super关键字就派上大用场了。super就像是子类与父类之间的“桥梁”,帮助我们在子类中访问父类的成员。

一、super调用父类构造方法

子类构造方法在执行时,默认会先调用父类的无参构造方法(通过super()实现)。如果父类没有无参构造方法,或者子类需要调用父类的有参构造方法,就必须显式使用super(参数列表),并且super()super(参数)必须放在子类构造方法的第一行

示例:调用父类有参构造方法

// 父类:动物类
class Animal {
    String name;
    // 父类只有有参构造方法(无无参构造)
    public Animal(String name) {
        this.name = name;
        System.out.println("父类Animal的有参构造被调用,name=" + name);
    }
}

// 子类:狗类,继承Animal
class Dog extends Animal {
    int age;

    // 子类构造方法,必须调用父类的有参构造
    public Dog(String name, int age) {
        super(name); // 显式调用父类的有参构造,必须放在第一行!
        this.age = age;
        System.out.println("子类Dog的构造被调用,age=" + age);
    }

    public static void main(String[] args) {
        Dog dog = new Dog("旺财", 3);
    }
}

运行结果

父类Animal的有参构造被调用,name=旺财
子类Dog的构造被调用,age=3

关键点
- 如果父类没有无参构造,子类必须用super(参数)显式调用父类构造,否则编译报错。
- super()必须放在子类构造方法的第一行,否则会报错。

二、super调用父类成员变量

当子类成员变量与父类成员变量同名时,直接访问会默认访问子类的变量。如果想访问父类的同名变量,需要用super.变量名

示例:访问父类成员变量

// 父类:人类
class Person {
    int score = 80; // 父类成员变量
}

// 子类:学生类,继承Person
class Student extends Person {
    int score = 95; // 子类成员变量,与父类同名

    void printScores() {
        System.out.println("子类score:" + score); // 访问子类变量
        System.out.println("父类score:" + super.score); // 访问父类变量
    }

    public static void main(String[] args) {
        Student stu = new Student();
        stu.printScores();
    }
}

运行结果

子类score:95
父类score:80

关键点
- super.变量名用于明确指定父类的成员变量,避免与子类同名变量冲突。

三、super调用父类成员方法

当子类重写了父类的方法时,子类方法中默认调用的是子类自己的方法。如果想调用父类被重写的方法,需要用super.方法名()

示例:调用父类被重写的方法

// 父类:动物类
class Animal {
    void eat() {
        System.out.println("父类:动物在吃饭");
    }
}

// 子类:狗类,重写父类的eat()方法
class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("子类:狗在吃骨头");
        super.eat(); // 调用父类被重写的eat()方法
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
    }
}

运行结果

子类:狗在吃骨头
父类:动物在吃饭

关键点
- super.方法名()用于在子类方法中调用父类的方法,即使子类重写了该方法。

四、注意事项

  1. 不能在静态方法中使用super
    静态方法属于类,而super是针对实例的,静态方法中没有“当前实例”的概念,因此无法使用super

  2. super()必须放在子类构造方法第一行
    否则会编译报错,因为父类构造方法需要先初始化。

  3. superthis不能同时用在构造方法中
    this()super()都必须放在构造方法第一行,因此不能同时调用。

总结

super关键字在Java继承中非常重要,主要用于:
- 调用父类构造方法(super()super(参数));
- 访问父类同名成员变量(super.变量名);
- 调用父类被重写的成员方法(super.方法名())。

掌握super能帮助你更清晰地控制子类与父类的成员关系,是理解Java继承的必备技能!

小夜