在构造函数中调用this()是否隐式调用super()?

Sur*_*raj 5 java constructor class

我试图理解

为什么this()和super()不能一起使用?

我已经在stackoverflow上阅读了很多相关的讨论,并且理解了很多东西.但我只有一个困惑是.

在构造函数中调用this()隐式调用super()

考虑这段代码..

class Top
{
    int z;
    Top()
    {
        System.out.println("Top default constructor");
    }

}
class A extends Top
{
    int x;
    A(int num)
    {
        x=num;
        System.out.println("A parameterized constructor");
    }
    A()
    {
        this(5);
        System.out.println("A default constructor");
    }
    public static void main(String arg[])
    {
        new A();
    }
}
Run Code Online (Sandbox Code Playgroud)

和OUTPUT是:

顶级默认构造函数

参数化构造函数

默认构造函数

我没想到输出" Top default constructor " 的第一行,因为没有super()调用,隐式或显式.

所以可能有一些我误解的东西.请解释.

T.J*_*der 8

在构造函数中调用this()是否隐式调用super()?

调用this()构造函数将调用该类的零参数构造函数.如果该类的zero-args构造函数没有显式调用super(...),那么是的,将会对zero-args 构造函数进行隐式调用super().如果你的类中的零参数构造函数显式调用了其他一些super签名,那么当然这样做了.

对于一般的构造函数来说,这是正确的.在你的A类中,由于你的A(int)构造函数没有任何对this() or的 调用super(),所以隐式super()完成.

我没想到输出"Top default constructor"中的第一行,因为没有super()调用,隐式或显式.

是的,有一个隐含的.:-)

基本规则是这样的:一些基类构造函数必须在派生类运行的代码之前运行.这就是调用this(...)super(...)必须是构造函数中的第一件事的原因.如果构造函数没有显式调用super(...),则总是隐式调用super()(没有args).


Era*_*ran 2

在构造函数内部调用this()会调用同一类的另一个构造函数。另一个构造函数将调用构造super()函数(隐式或显式),这就是为什么您不能在同一个构造函数中同时调用this()super(),因为这会导致super()调用两个构造函数。

请注意,每当我编写this()super()我并不一定意味着调用无参数构造函数(除了隐式调用,super()它总是对超类的无参数构造函数,如 Joeblade 所评论)。两个调用都可以有参数。

在您的代码示例中,A()构造函数调用A(int)构造函数(这就是this(5)所做的),构造函数Top()隐式调用(无参数)构造函数。

  • 很好的答案,但 super() 实际上是隐式调用时不带参数的构造函数。任何其他用途都必须显式调用。 (2认同)