提问者:小点点

构造函数中的super()有什么意义? [副本]


docs.oracle.com说:

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。 如果超类没有无参数构造函数,您将得到编译时错误。 Object确实有这样的构造函数,所以如果Object是唯一的超类,就没有问题。

如果super类有一个无参数构造函数,那么它将在没有super()的情况下自动被选中,如果没有,那么super()是多余的(编译错误)。 那么super()的显式调用有什么意义呢?


共1个答案

匿名用户

没有任何意义。 一点也不。

它存在的原因是因为它不存在会更奇怪:

超级(此处为some,arguments);

是有用的; 如果在构造函数中没有显式的super(...)this(...)调用,则构造函数的行为就像您在其顶部编写了super();一样,您不能选择退出这种行为。 有时,您希望调用一个不同的超构造函数(不是no-args的超构造函数,而是另一个超构造函数)。 如果父类没有no-args构造函数,那么编译器实际上会强制您添加显式的super(...)this(...)调用作为构造函数中的第一条语句(而且您还必须至少编写一个构造函数!)。

如果Java语言规范特意明确禁止super();(如:调用no-args超构造函数),那就太奇怪了。 出于同样的原因,如果编译器不允许编写,比如:x=x+0;,仅仅因为从表面上我们可以看出这样的语句没有意义,那就会很奇怪。

为什么有些源文件会这样做呢? 通常是因为有人使用IDE来生成构造函数,而IDE模板注入这一行部分是为了明确Java是如何工作的,主要是为了给您一个导航的位置,以调整您想要调用的超级构造函数。 有时,sourcefile的作者试图公开露骨是一种错误的尝试。