Java 中的构造函数链如何工作

发布时间:2023年12月26日

????????如何在 Java 中从另一个构造函数调用一个构造函数或什么是 Java 中的构造函数链是Java 面试中棘手的问题之一。那么,如果您想从基类或超类调用构造函数,则可以使用此关键字从同一类的另一个构造函数调用一个构造函数,那么您可以使用?super关键字。从一个构造函数调用另一个构造函数称为Java 中的构造函数链构造函数可以使用this()super()关键字自动或显式地相互调用this()表示同一个类的无参构造函数, super()表示父类的无参或默认构造函数。在同一个类中拥有多个构造函数也称为Java 中的构造函数重载

Java 中的构造函数链如何工作

正如所说,构造函数可以自动或显式调用其他构造函数。如果你没有从同一个类或超类调用任何构造函数,那么Java编译器将调用super() ,即父类的无参数构造函数。
?另外,对另一个构造函数的调用必须是构造函数中的第一行。假设您想调用同一类的另一个接受 int 参数的构造函数,您可以使用this(1)来调用该构造函数。?同样,如果该构造函数位于超类中,则可以使用super(1)来调用该构造函数。在 Java 中,不能从一个构造函数调用多个构造函数,因为每个构造函数调用都必须是第一个语句。?另外,如果您没有在类中声明任何构造函数,Java 将在您的类中添加默认或无参数构造函数。在下一节中,我们将看到如何在 Java 中从另一个构造函数调用一个构造函数的示例。

????????
/**
 * Java 程序演示如何在 Java 中链接构造函数。
 * 当一个构造函数在 Java 中调用另一个构造函数时,称为构造函数链。
 * this 和 super 关键字用于从另一个构造函数调用一个构造函数。
 */
public class ConstructorChaining {

    public static void main(String[] args) {
        // 测试 Java Derived 中的构造函数链
        Derived sub = new Derived("Test");
    }
}

class Base {
    protected String name;

    public Base() {
        this(""); // 调用同一类的一个参数构造函数
        System.out.println("基类的无参构造函数内部");
    }

    public Base(String name) {
        this.name = name;
        System.out.println("基类的一个参数构造函数");
    }
}

class Derived extends Base {

    public Derived() {
        System.out.println("派生类的无参构造函数内部");
    }

    public Derived(String name) {
        super(name); // 调用基类的一个参数构造函数
        System.out.println("派生类的一个参数构造函数内部");
    }
}

输出
Base类的一个参数构造函数
派生类的一个参数构造函数内部

Java 中的构造函数链接示例

下面是 Java 中构造函数链的代码示例。在此 Java 程序中,我们展示了如何使用this和super关键字调用构造函数。在 Java 中, this()调用同一类的构造函数,而super()调用父类的构造函数。?


在此示例中,我们通过调用接受String 参数的派生类的构造函数来创建派生类的实例,该构造函数然后类化为超类的一个参数构造函数。这是一个在 Java 中显式调用另一个构造函数的示例。为了演示自动构造函数链接,让我们看另一个例子

Derived sub = new Derived();

输出
Base类的一个参数构造函数
Base类的无参数构造函数内部
派生类的无参数构造函数内部
在此示例中,我们调用派生类的无参构造函数,该构造函数会自动调用超类的无参构造函数(在本例中为Base?),而超类又调用基类的 String 参数构造函数。?
由于派生类上没有显式构造函数调用,因此无参数构造函数默认调用super()。

?

关于 Java 构造函数链的要点

1) 调用同一个类或父类的另一个构造函数必须是构造函数中的第一条语句
2)如果你没有从父类或同一个类调用另一个构造函数,那么Java将调用超类的默认构造函数或无参数构造函数。
3)如果你没有在Java中声明任何构造函数,那么Java编译器会在你的类中添加一个默认或无参构造函数,默认情况下调用超类的无参构造函数。?
如果超类中没有无参构造函数,那么这将导致编译时错误。这就是为什么我们的类中应该始终有一个无参数构造函数
这就是什么是 Java 中的构造函数链和 Java 中的构造函数链如何工作的全部内容。请记住,this()和super()可用于在 Java 中显式调用同一类的构造函数和父类的构造函数。


?

文章来源:https://blog.csdn.net/Hua19859210361/article/details/135193681
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。