Java 中的构造函数链

2025年7月21日 | 阅读 5 分钟

Java中,构造函数与方法相同,唯一的区别是构造函数与类名相同。它用于创建类的实例。当我们创建类的对象时,它会自动调用。它没有返回类型。请记住,构造函数不能是抽象finalsynchronizedstatic。我们不能重写构造函数。

要阅读更多Java 构造函数

构造方法链

在 Java 中,构造函数链是指构造函数序列,其中一个构造函数通过仅使用实例来调用同一类内的另一个构造函数或调用其超类的另一个构造函数。

当我们创建派生类实例时,所有继承类(基类)的构造函数都会先被调用,之后才调用调用类(派生类)的构造函数。

我们可以通过继承来实现构造函数链。它是简化对象初始化的有效方法。它减少了代码的脆弱性。

构造函数链的类型

我们可以通过以下两种方式实现构造函数链:

  • 在同一类内:如果构造函数属于同一类,我们使用 this() 来调用同一类中的另一个构造函数。
  • 从基类调用:如果构造函数属于不同的类(父类和子类),我们使用 super() 来调用基类或父类中的构造函数。

请记住,更改构造函数的顺序不会影响输出。

What is constructor chaining in Java

为什么需要构造函数链?

假设有五个任务需要执行。有两种执行这些任务的方法:要么在一个构造函数中实现所有任务,要么在一个构造函数中创建单独的任务。

通过使用构造函数链机制,我们可以在一个构造函数中实现多个任务。因此,每当遇到这类问题时,我们都应该使用构造函数链。通过使用构造函数链,我们可以使程序更具可读性和可理解性。

  • 它促进了代码重用可读性
  • 它避免了重复初始化
  • 它使构造函数更简洁更易于维护

构造函数链的规则

  • this() 或 super() 必须是构造函数中的第一条语句。
  • 必须至少存在一个不使用 this() 的构造函数,以避免无限递归。
  • 我们不能在同一个构造函数中使用 both this()super()
  • 顺序在构造函数链中无关紧要。

注意:在同一个构造函数块中,我们不能同时使用 this() 和 super()。

让我们通过 Java 程序来理解这两个概念。

构造函数链示例

使用 this() 调用当前类构造函数

如果我们要调用同一类中的当前类构造函数,我们使用 this() 关键字。this() 的使用是强制性的,因为 JVM 不会自动像 super() 关键字那样放置它。请注意,this() 必须是构造函数的第一行。必须至少存在一个没有 this() 关键字的构造函数。

语法

例如

让我们创建一个 Java 程序并调用当前类构造函数。

示例

编译并运行

输出

Parameterized constructor called.
Default constructor called.

解释

在上面的示例中,我们创建了一个不带任何参数的类实例。由于 this(),它首先调用默认构造函数,默认构造函数将调用重定向到参数化构造函数。执行参数化构造函数内的语句,然后返回到默认构造函数。之后,将执行默认构造函数中其余的语句,对象将被成功初始化。以下是构造函数的调用顺序:

使用 super() 调用超类构造函数

有时,我们需要从子类(派生类)调用超类(父类)的构造函数。在这种情况下,我们在派生类构造函数中使用 super() 关键字。super() 是可选的,因为 JVM 会自动放置它。它应始终写在第一行。如果我们尝试在子类中调用超类构造函数,我们会得到一个语法错误。

语法

super(): 它调用超类的无参数或默认构造函数。

super(parameters): 它调用超类的参数化构造函数。

请记住,超类构造函数不能被子类继承。可以使用 super 关键字从子类构造函数中调用它。

让我们创建一个 Java 程序并在继承类中实现构造函数链。

示例

编译并运行

输出

Base class parameterized constructor called
Base class default constructor called
Derived class parameterized constructor called
Derived class default constructor called

构造函数链选择题

1. Java 中的构造函数链是什么?

  1. 在没有关系的类中定义多个构造函数
  2. 在同一类或超类中的一个构造函数调用另一个构造函数
  3. 在子类中重写构造函数
  4. 使用静态方法调用构造函数
 

答案:B

解释:构造函数链是指使用 this() 在同一类中从另一个构造函数调用一个构造函数,或使用 super() 从超类调用一个构造函数。


2. 以下哪个关键字用于调用同一类的构造函数?

  1. Super()
  2. extends
  3. this()
  4. static
 

答案:C

解释: this() 关键字用于在同一类中的另一个构造函数调用构造函数。


3. 以下关于构造函数链的说法哪项是真的?

  1. 构造函数链只能发生在同一类内。
  2. 对 super() 或 this() 的调用必须是构造函数的第一行。
  3. 我们可以在同一个构造函数中使用 this() 和 super()。
  4. 构造函数链仅允许在抽象类中使用。
 

答案:B

解释: Java 要求对另一个构造函数(this() 或 super())的调用必须是构造函数中的第一个语句。


4. Java 中的构造函数链不允许什么?

  1. 在不同的构造函数中使用 super() 和 this()
  2. 在同一个构造函数中使用 super() 和 this()
  3. 调用参数化构造函数
  4. 使用默认构造函数
 

答案:B

解释:不允许在同一个构造函数中使用 super() 和 this();这会导致编译时错误。


5. 以下关于构造函数链的说法哪项不正确。

  1. 它促进了代码重用和可读性。
  2. 它避免了重复初始化。
  3. 它使构造函数更简洁,更易于维护。
  4. 它促进了 OOP 概念。
 

答案:D

解释:构造函数链促进了代码重用、可读性,并避免了重复初始化。它还使构造函数更简洁、更易于维护。