所以说我有一个扩展超类的子类。在什么情况下我需要显式键入super()
才能运行超类构造函数?
我正在看一本关于抽象类的书中的示例,当它们使用非抽象子类扩展它时,子类的默认构造函数是空白的,并且有一条注释说将调用超类的默认构造函数。同时,我也在这里看到有人的问题没有明确调用super()
.
从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗?
所以说我有一个扩展超类的子类。在什么情况下我需要显式键入super()
才能运行超类构造函数?
我正在看一本关于抽象类的书中的示例,当它们使用非抽象子类扩展它时,子类的默认构造函数是空白的,并且有一条注释说将调用超类的默认构造函数。同时,我也在这里看到有人的问题没有明确调用super()
.
从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗?
你永远不需要只是
super();
如果您不指定其他任何内容,那就是那里。您只需要指定要调用的构造函数,如果:
您声称:
同时,我也在这里看到了有人的问题没有明确调用 super() 的实例。
你能举一些例子吗?我无法想象这怎么可能...
如果您没有显式调用超级构造函数,则将调用参数更少的构造函数 (super())。这意味着如果超类没有可访问的无参数构造函数,您必须自己调用特定的构造函数。
但通常情况下,即使您可以使用默认构造函数,您仍然想要一个不同的构造函数 - 取决于您的代码。
另请注意,如果没有声明构造函数,编译器会自动生成一个公共默认构造函数,但是一旦您编写了自己的构造函数,就不会再发生这种情况了。
该super()
方法总是在子类的构造函数中调用,即使它没有明确地写在代码中。
super(...)
唯一需要编写它的是超类中是否有多个具有不同初始化参数的方法。