¿Cuándo necesitas llamar explícitamente a un constructor de superclase?


Así que digamos que tengo una subclase que extiende una superclase. ¿En qué escenarios necesito escribir explícitamente super() para que se ejecute el constructor de superclase?

Estoy viendo un ejemplo en un libro sobre clases abstractas y cuando lo extienden con una subclase no abstracta, el constructor predeterminado de la subclase está en blanco y hay un comentario que dice que se llamará al constructor predeterminado de la superclase. Al mismo tiempo también he visto casos aquí donde el problema de alguien no era llamando explícitamente a super().

¿Es la distinción de llamar al constructor default/non-default de la superclase desde el constructor default/non-default de la subclase?

Author: Duncan Jones, 2011-06-12

3 answers

You never need just

super();

Eso es lo que estará allí si no especifica nada más. Usted solo necesita especificar el constructor a llamar si:

  • Desea llamar a un constructor de superclase que tiene parámetros
  • Desea encadenar a otro constructor de la misma clase en lugar del constructor de superclase

Usted afirma que:

Al mismo tiempo también he visto casos aquí donde el problema de alguien no estaba llamando explícitamente a super ().

¿Podría dar algún ejemplo? No puedo imaginar cómo es posible...

 138
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-11 21:34:07

Si no llamas explícitamente a un super constructor, se llamará al argumento less constructor (super ()). Esto significa que tienes que llamar a un constructor específico si no hay ningún constructor sin argumento accesible de la super clase.

Pero a menudo quieres un constructor diferente de todos modos, incluso si puedes usar el constructor predeterminado - depende de tu código.

También tenga en cuenta que si no se declara ningún constructor, el compilador genera un constructor público predeterminado automáticamente, pero tan pronto como escribes tu propio constructor esto ya no sucede.

 10
Author: Voo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-11 21:25:37

El método super() siempre se llama en constructores de subclases, incluso si no está escrito explícitamente en código.

La única vez que necesita escribirlo, es si hay varios métodos super(...) en la super-clase con diferentes parámetros de inicialización.

 4
Author: Omnaest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 07:14:28