跳到主要内容

Java简述super()与this()的区别?

参考答案:

在Java中,super()this()都是特殊类型的构造函数调用,它们被用于在构造函数中初始化父类和当前类的状态。但是,它们之间存在一些关键的区别:

  1. 调用对象

    • super():用于调用父类(或超类)的构造函数。
    • this():用于调用当前类的另一个构造函数(也称为重载构造函数)。
  2. 使用时机

    • super():在子类的构造函数中,第一行必须是super()调用(如果父类没有无参构造函数,则必须明确指定参数),以初始化从父类继承的字段。
    • this():可以在任何构造函数中调用,以初始化当前类的字段。通常,它用于共享一些初始化代码,以避免重复。
  3. 调用次数

    • super():在一个子类的构造函数中只能调用一次。
    • this():可以在一个构造函数中多次调用,用于调用当前类的其他构造函数。但是,必须确保this()调用是构造函数中的第一条语句。
  4. 默认行为

    • 如果子类构造函数没有显式调用super(),则Java编译器会隐式地插入一个super()调用作为第一行。这确保了父类被正确初始化。
    • this()调用不是隐式的。如果需要使用其他构造函数初始化当前对象,必须显式调用this()

示例:

class Parent {
    Parent() {
        System.out.println("Parent Constructor");
    }

    Parent(String message) {
        System.out.println("Parent Constructor with message: " + message);
    }
}

class Child extends Parent {
    Child() {
        super(); // 显式调用父类的无参构造函数
        System.out.println("Child Constructor");
    }

    Child(String message) {
        super(message); // 显式调用父类的带参数构造函数
        System.out.println("Child Constructor with message: " + message);
    }

    Child(String message, int number) {
        this(message); // 调用当前类的另一个构造函数
        System.out.println("Child Constructor with message and number: " + number);
    }
}

public class Test {
    public static void main(String[] args) {
        new Child(); // 输出:Parent Constructor, Child Constructor
        new Child("Hello"); // 输出:Parent Constructor with message: Hello, Child Constructor with message: Hello
        new Child("Hello", 42); // 输出:Parent Constructor with message: Hello, Child Constructor with message: Hello, Child Constructor with message and number: 42
    }
}

这个示例展示了如何在子类的构造函数中使用super()this(),以及它们如何影响构造函数的行为。