在没有构造函数的类上调用super()

时间:2013-12-30 06:17:50

标签: java inheritance

我刚注意到在工作中分配的一个非常大的项目的代码库中,一个特定的类没有构造函数。但它的子类调用super()

有人可以解释当子类调用super()时会发生什么,但父级中没有构造函数吗?

(我可以猜测效果就像调用一个空构造函数,但我想知道幕后是否还有其他事情发生了。)

6 个答案:

答案 0 :(得分:3)

如果你没有任何参数化构造函数,那么我严格意味着没有构造函数,只有那时java才会为你添加一个默认构造函数(一个没有参数)。

每个构造函数都必须调用它的超类的构造函数。您不能在子类构造函数中执行任何其他操作,直到调用继承树中的所有超类构造函数。因此,此调用必须是子类构造函数的第一行。如果您不再提供一个,那么java会为您执行此操作。

参考

Why does this() and super() have to be the first statement in a constructor?

答案 1 :(得分:2)

如果某个类没有任何构造函数,则意味着它由java编译器使用空构造函数

如果放置空构造函数,则编译器不会,因为您已经提到过它。

现在如果您希望自己的构造函数具有自己的参数,那么java编译器将不会有任何默认构造函数

Check this for more info on constructors

答案 2 :(得分:2)

子类构造函数在执行任何语句之前总是先调用其父构造函数。如果父类中没有consturctor,那么无论是否显式调用它,super()调用都将由java编译器添加到代码中,因此将由JVM执行。

答案 3 :(得分:1)

当类没有声明任何构造函数时,java编译器将提供没有主体的默认无参数构造函数。在基类构造函数中调用super()将调用该默认构造函数。

答案 4 :(得分:1)

  

有人可以解释一下子类调用时会发生什么   super(),但父级中没有构造函数?

如果父类没有任何构造函数,那么java编译器将调用它的默认构造函数。如果您不想调用默认构造函数,那么您可以在该类中创建自己的空构造函数。

答案 5 :(得分:1)

如果您没有明确提供,编译器会在您的类中添加一个没有参数的默认构造函数。所以在你的情况下,它调用默认构造函数。