在继承中执行 Java 构造函数

Mehvish Ashiq 2023年1月30日 2022年4月26日
  1. 在继承中执行 Java 构造函数
  2. 在继承中执行默认 Java 构造函数
  3. 当父类具有默认和参数化构造函数时在继承中执行 Java 构造函数
  4. 使用 super 调用父类和所有子类的参数化构造函数
在继承中执行 Java 构造函数

今天,我们将学习继承中 Java 构造函数的执行。我们将在派生类(也称为子类和子类)中看到默认构造函数和参数化构造函数的代码示例。

在继承中执行 Java 构造函数

继续这篇文章需要足够的继承知识。如果你正在阅读本教程,我们假设你对 Java 继承有深入的了解。

让我们在使用 extends 关键字扩展父类(也称为基类或超类)时了解 Java 构造函数的执行过程。

在继承中执行默认 Java 构造函数

示例代码:

class parentClass{
    parentClass(){
        System.out.println("Default constructor of the parent class.");
    }
}

class childClass extends parentClass{
    childClass(){
        System.out.println("Default constructor of the child class.");
    }
}

class grandChildClass extends childClass{
    grandChildClass(){
        System.out.println("Default constructor of the grand child class.");
    }
}

public class constructorsInInheritance {
    public static void main(String[] args) {
        grandChildClass obj = new grandChildClass();
    }
}

输出:

Default constructor of the parent class.
Default constructor of the child class.
Default constructor of the grand child class.

在这里,我们有一个名为 constructorsInInheritance 的测试类,它创建 grandChildClass 的对象。

我们还有另外三个名为 parentClasschildClassgrandChildClass 的类,其中 grandChildClass 继承 childClasschildClass 扩展了 parentClass

这里,parentClass 默认构造函数由 childClass 构造函数自动调用。每当我们实例化子类时,都会自动执行父类的构造函数,然后是子类的构造函数。

观察上面给出的输出。如果仍然感到困惑,请参阅以下视觉说明。

在继承中执行 java 构造函数 - 可视化解释

如果我们在 main 方法中创建 childClass 的对象会怎样?现在将如何执行默认构造函数?

parentClass 的构造函数将首先执行,然后 childClass 的构造函数将产生以下结果。

输出:

Default constructor of the parent class.
Default constructor of the child class.

当父类具有默认和参数化构造函数时在继承中执行 Java 构造函数

示例代码:

class parentClass{
    parentClass(){
        System.out.println("Default constructor of the parent class.");
    }
    parentClass(String name){
        System.out.println("Hi " + name +
                           "! It's a parameterized constructor of the parent class");
    }
}

class childClass extends parentClass{
    childClass(){
        System.out.println("Default constructor of the child class.");
    }
}

class grandChildClass extends childClass{
    grandChildClass(){
        System.out.println("Default constructor of the grand child class.");
    }
}

public class constructorsInInheritance {
    public static void main(String[] args) {
        grandChildClass obj = new grandChildClass();
    }
}

输出:

Default constructor of the parent class.
Default constructor of the child class.
Default constructor of the grand child class.

在这里,我们在 parentClass 中有一个参数化的构造函数。但是,仍然调用默认构造函数,因为我们在 main 方法中调用 grandChildClass() 默认构造函数,进一步调用父类默认构造函数。

我们还要在 childClassgrandChildClass 中编写参数化构造函数。然后,在 main 函数中调用 grandChildClass 的参数化构造函数。

观察调用了哪些构造函数,它们是默认的还是参数化的。

示例代码:

class parentClass{
    parentClass(){
        System.out.println("Default constructor of the parent class.");
    }
    parentClass(String name){
        System.out.println("Hi " + name +
                           "! It's a parameterized constructor of the parent class");
    }
}

class childClass extends parentClass{
    childClass(){
        System.out.println("Default constructor of the child class.");
    }
    childClass(String name){
        System.out.println("Hi " + name +
                           "! It's a parameterized constructor of the child class");
    }
}

class grandChildClass extends childClass{
    grandChildClass(){
        System.out.println("Default constructor of the grand child class.");
    }
    grandChildClass(String name){
        System.out.println("Hi " + name +
                      "! It's a parameterized constructor of the grand child class");
    }
}

public class constructorsInInheritance {
    public static void main(String[] args) {
        grandChildClass obj = new grandChildClass("Mehvish");
    }
}

输出:

Default constructor of the parent class.
Default constructor of the child class.
Hi Mehvish! It's a parameterized constructor of the grand child class

上面的代码只调用了 grandChildClass 的参数化构造函数。我们使用 super() 调用 parentClasschildClassgrandChildClass 的参数化构造函数。

请记住,父类构造函数调用必须在子类构造函数的第一行。

使用 super 调用父类和所有子类的参数化构造函数

示例代码:

class parentClass{
    parentClass(){
        System.out.println("Default constructor of the parent class.");
    }
    parentClass(String name){
        System.out.println("Hi " + name +
                           "! It's a parameterized constructor of the parent class");
    }
}

class childClass extends parentClass{
    childClass(){
        System.out.println("Default constructor of the child class.");
    }
    childClass(String name){
        super(name);
        System.out.println("Hi " + name +
                           "! It's a parameterized constructor of the child class");
    }
}

class grandChildClass extends childClass{
    grandChildClass(){
        System.out.println("Default constructor of the grand child class.");
    }
    grandChildClass(String name){
        super(name);
        System.out.println("Hi " + name +
                  "! It's a parameterized constructor of the grand child class");
    }
}

public class constructorsInInheritance {
    public static void main(String[] args) {
        grandChildClass obj = new grandChildClass("Mehvish");
    }
}

输出:

Hi Mehvish! It's a parameterized constructor of the parent class
Hi Mehvish! It's a parameterized constructor of the child class
Hi Mehvish! It's a parameterized constructor of the grand child class

我们使用 super 关键字来调用参数化的父类构造函数。它指的是父类(超类或基类)。

我们用它来访问父类的构造函数并调用父类的方法。

super 对于在父类和子类中具有确切名称的方法非常有用。

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相关文章 - Java Inheritance