你什么时候需要显式调用超类的构造函数?

问题描述:

所以说我有一个扩展超类的子类。在什么情况下,我需要明确键入super()才能让超类构造函数运行?你什么时候需要显式调用超类的构造函数?

我正在看一本关于抽象类的书中的例子,当他们用非抽象的子类扩展它时,子类的默认构造函数是空白的,并且有一个说明超类的默认构造函数将被调用的注释。与此同时,我也看到了在这里的情况下,某人的问题没有明确地呼吁super()

区别于从子类的默认/非默认构造函数调用超类的默认/非默认构造函数?

+0

是我还是没有答案解决“为什么你需要调用一个超类的构造函数在一个子类” – 2016-04-09 08:03:45

从未需要的正好

super(); 

那会是什么那里,如果你不指定任何东西。您需要指定构造函数调用,如果:

  • 你想在同一个类来调用它有参数的超类构造函数
  • 你想链到另一个构造函数,而不是父类的构造的

你声称:

同时我也看到了在这里的实例,其中一个人的问题不是explic它打电话给super()。

你能举几个例子吗?我无法想象这怎么可能...

+4

是的,我应该更清楚。这是超级(有争论)。感谢您的回答。 – jhlu87 2011-06-11 21:35:28

+0

你说得对。但是关于这个:'同时我也看到了在这里某些人的问题没有明确地调用super()的例子。“当父构造函数没有noarg构造函数时会发生这种情况。在这种情况下,如果你没有明确地调用super(),你会得到一个错误。 – ACV 2016-02-26 13:24:38

+1

@ACV:显式调用'super()'也不会在那里工作。使用非空参数列表调用superconstructor *会起作用,但只使用'super()'不会。 – 2016-02-26 13:28:19

如果你没有明确地调用一个超级构造函数,那么将调用参数less构造函数(super())。这意味着如果超类没有可用的无参数构造函数,则必须自己调用特定的构造函数。

但是,即使您可以使用默认构造函数 - 取决于您的代码,通常情况下您还是需要不同的构造函数。

另请注意,如果没有声明构造函数,编译器会自动生成一个公共的默认构造函数,但只要您编写自己的构造函数,就不会再发生这种情况。

+1

只是为了确保我明白。如果在我的超类中,我有一个构造函数,它不是默认的构造函数(说它需要一个参数)。然后在我的子类的构造函数中,我需要显式调用super(param),因为编译器将不再生成超类的默认构造函数? – jhlu87 2011-06-11 21:38:01

+1

@ jhlu87,正确的 – bestsss 2011-06-11 21:46:46

super()方法总是在子类的构造函数中调用,即使它没有明确写入代码。

您需要编写它的唯一时间是在具有不同初始化参数的超类中有多个super(...)方法。

+5

“唯一需要编写它的时间是,如果超类中有几个具有不同初始化参数的超类(...)方法。”不对。只要有一个可用的参数较少的构造函数,就可以有一百个其他构造函数没有任何问题。 – Voo 2011-06-11 21:28:12