在java中,类中的构造函数可以调用其超类的重载构造函数(假设我们想要显式且有意地进行调用)。我知道类中的构造函数对superclass的no-arg默认构造函数进行隐式调用(使用super();)。但是假设我调用了一个重载的超类构造函数(比如super(String s);),那么我的问题是,这可能吗?如果这是可能的话,那么对super()的调用是否仍然超级超级(String s),它的含义是什么?也可以从同一个类的一个无参数和一个重载的两个构造函数相互调用?如果他们这样做,他们会陷入困境吗?
答案 0 :(得分:1)
您可以在其官方教程中获得答案: https://docs.oracle.com/javase/tutorial/java/IandI/super.html
具体阅读:
调用超类构造函数的语法是
super();
或:
super(parameter list);
使用super(),调用超类无参数构造函数。用super(参数列表), 调用具有匹配参数列表的超类构造函数。
注意:如果构造函数没有显式调用超类 构造函数,Java编译器自动插入一个调用 超类的无参数构造函数。如果超级班没有 有一个无参数的构造函数,你会得到一个编译时错误。 对象确实有这样的构造函数,所以如果Object是唯一的 超类,没有问题。如果子类构造函数调用a 它的超类的构造函数,无论是显式还是隐式 可能会认为会有一整套构造函数被称为 一直回到Object的构造函数。事实上,这就是 案件。它被称为构造函数链接,您需要注意 当有很长的阶级下降时。
所以回答你的问题: 是的,这是可能的,也是可行的。当您使用参数显式调用超级构造函数时,只调用该构造函数。
并且,确保超级构造函数调用是构造函数中的第一行,否则将显示编译器错误。
***** EDITED *****
并且,您只能隐式或显式地调用一个特定的超类构造函数。当调用该超类构造函数时,不会调用其他超类构造函数,除非在您调用的超类构造函数中调用它。同时,如果在同一个类中,多个构造函数以递归方式相互调用,则无法进行编译 - 它将被编译器拒绝。
希望这有帮助。