杰瑞科技汇

Java中的super究竟指什么?

super 是 Java 中的一个关键字,它主要在子类中使用,用来指代父类(超类),你可以把它理解为对父类的一个“引用”或“指针”。

Java中的super究竟指什么?-图1
(图片来源网络,侵删)

super 的核心作用有三个,下面我们逐一说明。


调用父类的构造方法

这是 super 最常见和最重要的用途,子类在创建对象时,会先调用父类的构造方法,以确保父类中定义的属性和行为得到正确的初始化。

语法:

  • super(); // 调用父类的无参构造方法
  • super(参数列表); // 调用父类的有参构造方法

规则:

  • 隐式调用:如果在子类的构造方法中没有显式地使用 super() 来调用父类的构造方法,Java 编译器会自动在子类构造方法的第一行插入一个 super(),这意味着子类默认会调用父类的无参构造方法。
  • 必须放在第一行:如果使用了 super(),它必须是子类构造方法中的第一条语句,不能在任何代码(包括 this())之前。
  • 构造链:通过 super(),可以形成一条从子类到父类,再到祖父类的构造方法调用链,直到 Object 类(所有类的终极父类)。

示例:

// 父类
class Animal {
    private String name;
    // 父类的无参构造方法
    public Animal() {
        System.out.println("Animal 的无参构造方法被调用");
        this.name = "未知动物";
    }
    // 父类的有参构造方法
    public Animal(String name) {
        System.out.println("Animal 的有参构造方法被调用");
        this.name = name;
    }
}
// 子类
class Dog extends Animal {
    public Dog() {
        // 这里隐式调用了 super(),即调用父类的 Animal()
        System.out.println("Dog 的无参构造方法被调用");
    }
    public Dog(String dogName) {
        // 显式调用父类的有参构造方法 Animal(String name)
        super(dogName); 
        System.out.println("Dog 的有参构造方法被调用");
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println("--- 创建 Dog 对象(使用无参构造)---");
        Dog dog1 = new Dog();
        // 输出:
        // Animal 的无参构造方法被调用
        // Dog 的无参构造方法被调用
        System.out.println("\n--- 创建 Dog 对象(使用有参构造)---");
        Dog dog2 = new Dog("旺财");
        // 输出:
        // Animal 的有参构造方法被调用
        // Dog 的有参构造方法被调用
    }
}

访问父类的成员变量

当子类的成员变量(字段)与父类的成员变量同名时,如果想在子类中访问父类的那个变量,就需要使用 super

语法:

  • super.父类成员变量名;

示例:

class Parent {
    int value = 10; // 父类的 value
}
class Child extends Parent {
    int value = 20; // 子类的 value,与父类同名
    public void printValues() {
        System.out.println("子类的 value: " + this.value); // 使用 this 访问子类自己的 value
        System.out.println("父类的 value: " + super.value); // 使用 super 访问父类的 value
    }
}
public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.printValues();
    }
}

输出:

Java中的super究竟指什么?-图2
(图片来源网络,侵删)
子类的 value: 20
父类的 value: 10

调用父类的成员方法

当子类重写(Override)了父类的方法后,如果想在子类的方法中调用父类被重写的方法,就需要使用 super

语法:

  • super.父类方法名(参数列表);

示例:

class Vehicle {
    public void move() {
        System.out.println("车辆可以移动");
    }
}
class Car extends Vehicle {
    @Override // 注解,表示重写父类方法
    public void move() {
        // 在子类的 move 方法中,先调用父类的 move 方法
        super.move(); 
        System.out.println("汽车通过轮子移动");
    }
}
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.move();
    }
}

输出:

车辆可以移动
汽车通过轮子移动

在这个例子中,Car 类重写了 Vehiclemove 方法,但在 Carmove 方法内部,我们使用 super.move() 来执行父类 Vehicle 的原始 move 方法,然后再添加自己的特有逻辑,这是一种非常常见的扩展父类功能的模式。


superthis 的区别

为了更好地理解 super,我们常常会把它和 this 放在一起比较。

Java中的super究竟指什么?-图3
(图片来源网络,侵删)
特性 this super
含义 指向当前对象的引用。 指向父类对象的引用。
访问成员变量 this.变量名:访问当前类的成员变量,如果变量名与局部变量同名,用来区分。 super.变量名:访问父类的成员变量(即使被子类隐藏)。
调用成员方法 this.方法名():调用当前类的成员方法。 super.方法名():调用父类的成员方法(通常用于调用被重写的方法)。
调用构造方法 this(参数列表):调用当前类的另一个构造方法。 super(参数列表):调用父类的构造方法。
使用位置 在当前类的构造方法中,this() 必须是第一行。 在子类的构造方法中,super() 必须是第一行。

super 是 Java 面向对象编程中实现继承特性的一个关键字,它扮演着连接子类与父类的桥梁角色,它的主要功能可以概括为:

  1. 构造连接super() 用于在子类构造方法中调用父类的构造方法,确保父类部分被正确初始化。
  2. 变量访问:当子类变量与父类变量同名时,super.变量名 用于访问父类的变量。
  3. 方法调用:当子类重写了父类的方法时,super.方法名() 用于在子类中调用父类的原始版本。

掌握 super 的用法对于理解和运用 Java 的继承机制至关重要。

分享:
扫描分享到社交APP
上一篇
下一篇