95 votes

Quand devez-vous appeler explicitement un constructeur de superclasse ?

Disons que j'ai une sous-classe qui étend une super-classe. Dans quels scénarios dois-je explicitement taper super() pour que le constructeur de la superclasse s'exécute ?

Je regarde un exemple dans un livre sur les classes abstraites et quand ils l'étendent avec une sous-classe non-abstraite, le constructeur par défaut de la sous-classe est vide et il y a un commentaire qui dit que le constructeur par défaut de la super-classe sera appelé. En même temps, j'ai vu ici des cas où le problème de quelqu'un était de ne pas appeler explicitement le constructeur par défaut de la superclasse. super() .

La distinction consiste-t-elle à appeler le constructeur par défaut/non par défaut de la superclasse à partir du constructeur par défaut/non par défaut de la sous-classe ?

140voto

Jon Skeet Points 692016

Vous jamais besoin juste

super();

C'est ce qui sera présent si vous ne spécifiez rien d'autre. Vous uniquement doivent spécifier le constructeur à appeler si :

  • Vous voulez appeler un constructeur de superclasse qui a des paramètres
  • Vous voulez enchaîner à un autre constructeur dans la même classe au lieu du constructeur de la superclasse.

Vous prétendez que :

En même temps, j'ai aussi vu ici des cas où le problème de quelqu'un était de ne pas appeler explicitement super().

Pouvez-vous donner des exemples ? Je n'arrive pas à imaginer comment c'est possible...

10voto

Voo Points 11981

Si vous n'appelez pas explicitement un super constructeur, le constructeur sans argument (super()) sera appelé. Cela signifie que vous devez appeler vous-même un constructeur spécifique s'il n'y a pas de constructeur sans argument accessible de la super classe.

Mais il arrive souvent que l'on veuille un constructeur différent même si l'on peut utiliser le constructeur par défaut - cela dépend de votre code.

Notez également que si aucun constructeur n'est déclaré, le compilateur génère automatiquement un constructeur public par défaut, mais dès que vous écrivez votre propre constructeur, cela ne se produit plus.

3voto

Omnaest Points 2511

Le site super() est toujours appelée dans les constructeurs des sous-classes, même si elle n'est pas explicitement écrite dans le code.

La seule fois où vous devez l'écrire, c'est s'il y a plusieurs super(...) dans la super-classe avec des paramètres d'initialisation différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X