我刚注意到在工作中分配的一个非常大的项目的代码库中,一个特定的类没有构造函数。但它的子类调用super()
。
有人可以解释当子类调用super()
时会发生什么,但父级中没有构造函数吗?
(我可以猜测效果就像调用一个空构造函数,但我想知道幕后是否还有其他事情发生了。)
答案 0 :(得分:3)
如果你没有任何参数化构造函数,那么我严格意味着没有构造函数,只有那时java才会为你添加一个默认构造函数(一个没有参数)。
每个构造函数都必须调用它的超类的构造函数。您不能在子类构造函数中执行任何其他操作,直到调用继承树中的所有超类构造函数。因此,此调用必须是子类构造函数的第一行。如果您不再提供一个,那么java会为您执行此操作。
参考
Why does this() and super() have to be the first statement in a constructor?
答案 1 :(得分:2)
如果某个类没有任何构造函数,则意味着它由java编译器使用空构造函数。
如果放置空构造函数,则编译器不会,因为您已经提到过它。
现在如果您希望自己的构造函数具有自己的参数,那么java编译器将不会有任何默认构造函数
答案 2 :(得分:2)
子类构造函数在执行任何语句之前总是先调用其父构造函数。如果父类中没有consturctor,那么无论是否显式调用它,super()调用都将由java编译器添加到代码中,因此将由JVM执行。
答案 3 :(得分:1)
当类没有声明任何构造函数时,java编译器将提供没有主体的默认无参数构造函数。在基类构造函数中调用super()
将调用该默认构造函数。
答案 4 :(得分:1)
有人可以解释一下子类调用时会发生什么 super(),但父级中没有构造函数?
如果父类没有任何构造函数,那么java编译器将调用它的默认构造函数。如果您不想调用默认构造函数,那么您可以在该类中创建自己的空构造函数。
答案 5 :(得分:1)
如果您没有明确提供,编译器会在您的类中添加一个没有参数的默认构造函数。所以在你的情况下,它调用默认构造函数。