📜  Javasuper()和this()的区别(1)

📅  最后修改于: 2023-12-03 15:01:49.377000             🧑  作者: Mango

Java中的super()和this()

在Java中,super()和this()都是构造函数中用于调用其他构造函数的关键字。然而,它们的使用方式和作用却有所不同。本文将详细介绍它们的区别。

super()

super()是用于调用父类构造函数的关键字。它可以帮助子类构造函数初始化从父类继承而来的属性。

使用super()有以下几个特点:

  1. super()必须是子类构造函数的第一条语句。
  2. 如果子类构造函数没有显式地调用super(),那么默认情况下会调用父类的无参构造函数。
  3. 如果父类没有无参构造函数,那么子类的构造函数必须显式地调用带有参数的父类构造函数,并传入所需的参数。

下面是一个使用super()的示例:

class Parent {
    int x;

    Parent(int x) {
        this.x = x;
    }
}

class Child extends Parent {
    int y;

    Child(int x, int y) {
        super(x);
        this.y = y;
    }
}

在这个示例中,子类Child的构造函数使用super(x)调用了父类Parent的构造函数,并传入了一个参数x,以初始化从父类继承而来的属性。

this()

this()是用于调用当前类的其他构造函数的关键字。它可以帮助构造函数在不同的构造函数之间实现代码复用。

使用this()有以下几个特点:

  1. this()必须是构造函数中的第一条语句。
  2. this()不能递归调用同一个构造函数,否则会导致栈溢出。
  3. 如果一个构造函数调用了另一个构造函数,那么它们两个之间的参数列表和调用方式必须匹配。

下面是一个使用this()的示例:

class Person {
    String name;
    int age;

    Person(String name) {
        this(name, 0);
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

在这个示例中,构造函数Person(String name)调用了另一个构造函数Person(String name, int age),从而实现了代码复用。

总结
  • super()用于调用父类构造函数,this()用于调用当前类的其他构造函数。
  • super()必须是子类构造函数的第一条语句,this()也必须是构造函数中的第一条语句。
  • 如果子类构造函数没有显式地调用super(),那么会默认调用父类的无参构造函数;如果父类没有无参构造函数,那么子类的构造函数必须显式地调用带有参数的父类构造函数,并传入所需的参数。
  • this()不能递归调用同一个构造函数,否则会导致栈溢出;如果一个构造函数调用了另一个构造函数,那么它们两个之间的参数列表和调用方式必须匹配。