Java 中继承中的构造函数

10 Sept 2024 | 4 分钟阅读

Java 中的类通过强大的继承机制,可以继承另一个类的特征和行为。构造函数在初始化对象和在处理继承时维护类的层级结构的正确运行方面至关重要。在本节中,我们将探讨Java 继承中的构造函数功能,并提供详尽的解释和示例。

构造函数基础

构造函数是负责初始化类对象的独特过程。当调用 new 关键字时,它会创建一个与主类同名的对象。继承是在 Java 中构建子类的过程,它从超类获取属性和方法。在创建子类时,超类构造函数会立即被调用,以确保继承的属性得到正确初始化。

构造方法链

构造函数可以通过调用同一类或其他超类的构造函数来调用另一个构造函数,这被称为构造函数链。这确保了,在继承的情况下,从顶层超类到实例化子类的层级结构中的每个类的构造函数都会被调用。

Constructor.java

输出

Animal constructor called
Dog constructor called
Buddy is eating
Buddy is barking

在这种情况下,当创建一个 Dog 对象时,Animal 类的构造函数首先使用 super(name) 自动调用以初始化 name 属性。然后,通过调用 Dog 类的构造函数来完成 breed 属性的初始化。

继承中的默认构造函数

如果类没有显式声明构造函数,Java 会提供一个不带参数的默认构造函数。如果超类没有无参构造函数,则在构造子类时,子类构造函数必须使用 super() 来显式调用超类的一个构造函数。

Constructor.java

在此,由于 Circle 类使用 super(color) 来显式调用 Shape 类的构造函数,因此 color 属性得到了正确初始化。

继承中的构造函数重载

Java 中一个类可以有多个构造函数,这被称为构造函数重载。在处理继承时,层级结构中的每个构造函数都可以被重载,以便在创建对象时提供更大的灵活性。

隐式 Super 调用

在 Java 中,如果子类中的构造函数没有使用 super 显式调用其超类的构造函数,则编译器会自动在子类构造函数的第一个语句中插入对超类默认构造函数的调用。这种调用被称为隐式 super 调用。但是,如果子类构造函数没有显式调用超类,并且超类包含一个默认构造函数,则会出现编译错误。

超类构造函数和初始化顺序

当创建子类对象时,子类及其超类的构造函数会按照特定的顺序执行。总是先调用超类构造函数,然后再调用子类构造函数。它确保超类组件首先被初始化。执行顺序如下:

  • 按照出现顺序,超类的静态变量和静态代码块。
  • 按照出现顺序,子类的静态变量和静态代码块。
  • 超类的实例变量和实例代码块(按照出现顺序)。
  • 超类的构造函数。
  • 按照出现顺序,子类的实例变量和实例代码块。
  • 子类的构造函数。