Pourquoi les constructeurs ne peuvent-ils pas être finaux, statiques ou abstraits en Java ?
Par exemple, pouvez-vous m'expliquer pourquoi ceci n'est pas valable ?
public class K {
abstract public K() {
// ...
}
}
Pourquoi les constructeurs ne peuvent-ils pas être finaux, statiques ou abstraits en Java ?
Par exemple, pouvez-vous m'expliquer pourquoi ceci n'est pas valable ?
public class K {
abstract public K() {
// ...
}
}
Lorsque vous définissez une méthode comme final
ça veut dire : "Je ne veux pas qu'une classe passe outre." Mais selon la spécification du langage Java :
JLS 8.8 - "Les déclarations de constructeur ne sont pas des membres. Elles ne sont jamais héritées et ne sont donc pas soumises au masquage ou à la surcharge."
Lorsque vous définissez une méthode comme abstract
ça veut dire : "Cette méthode n'a pas de corps et doit être implémentée dans une classe enfant." Mais le constructeur est appelé implicitement lorsque la fonction new
est utilisé pour qu'il ne puisse pas manquer de corps.
Lorsque vous définissez une méthode comme static
ça veut dire : "Cette méthode appartient à la classe, pas à un objet particulier." Mais le constructeur est implicitement appelé pour initialiser un objet, il n'y a donc aucun intérêt à avoir un constructeur statique.
La question est vraiment de savoir pourquoi vous voulez que le constructeur soit static or abstract or final
.
Les constructeurs ne sont pas hérités et ne peuvent donc pas être surchargés, alors à quoi cela sert-il ? d'avoir un constructeur final
Le constructeur est appelé automatiquement quand une instance de la classe est créé, il a accès aux champs d'instance de la classe. Quelle sera l'utilisation d'un constructeur statique.
Le constructeur ne peut pas être surchargé, donc que ferez-vous avec une abstraction ? abstrait.
Un constructeur Java est implicitement final, les aspects statiques/non statiques de sa sémantique sont implicite 1 et c'est inutile pour qu'un constructeur Java soit abstrait.
Cela signifie que le final
y static
seraient redondants, et les modificateurs abstract
le mot-clé n'aurait aucune signification.
Naturellement, les concepteurs de Java n'ont pas vu l'intérêt d'autoriser des modificateurs d'accès redondants et/ou dénués de sens sur les constructeurs... ils ne sont donc pas autorisés par la grammaire Java.
Remarque : il est dommage qu'ils n'aient pas fait le même choix de conception pour les méthodes d'interface où l'attribut public
y abstract
sont également redondants, mais sont tout de même autorisés. Peut-être y a-t-il une raison historique (ancienne) à cela. Mais quoi qu'il en soit, il ne peut être corrigé sans rendre incompilables (probablement) des millions de programmes Java existants.
1 - En fait, les constructeurs ont un mélange de sémantique statique et non statique. Vous ne pouvez pas "appeler" un constructeur sur une instance, et ils ne sont pas hérités, ou surchargés. Ceci est similaire à la façon dont les méthodes statiques fonctionnent. D'un autre côté, le corps d'un constructeur peut se référer à this
et appeler les méthodes d'instance ... comme une méthode d'instance. Et puis il y a le chaînage des constructeurs, qui est propre aux constructeurs. Mais l'essentiel est que cette sémantique est fixe, et qu'il n'y a aucune raison de permettre une redondance et probablement une confusion entre les deux. static
modificateur.
public
Constructeur : Les objets peuvent être créés n'importe où.
Constructeur par défaut : Les objets ne peuvent être créés que dans le même paquet.
protected
Constructeur : Les objets peuvent être créés par des classes extérieures au paquetage uniquement s'il s'agit d'une sous-classe.
private
Constructeur : L'objet ne peut être créé qu'à l'intérieur de la classe (par exemple, lors de l'implémentation d'un singleton).
El static
, final
y abstract
ne sont pas significatifs pour un constructeur car :
static
Les membres appartiennent à une classe, mais le constructeur est nécessaire pour créer un objet.
Un site abstract
est une classe partiellement implémentée, qui contient des méthodes abstraites à implémenter dans la classe enfant.
final
restreint les modifications : les variables deviennent constantes, les méthodes ne peuvent pas être surchargées et les classes ne peuvent pas être héritées.
Final : Parce que vous ne pouvez pas écraser/extendre un constructeur de toute façon. Vous pouvez étendre une classe (pour éviter de la rendre finale) ou écraser une méthode (pour éviter de la rendre finale), mais il n'y a rien de tel pour les constructeurs.
Statique : Si on regarde l'exécution un constructeur n'est pas statique (il peut accéder aux champs d'instance), si on regarde du côté de l'appelant il est (en quelque sorte) statique (on l'appelle sans avoir d'instance. Il est difficile d'imaginer qu'un constructeur soit complètement statique ou non statique et sans avoir une séparation sémantique entre ces deux choses, cela n'a pas de sens de les distinguer avec un modificateur.
Résumé : L'abstrait n'a de sens qu'en présence d'écrasement/extension, donc le même argument que pour 'final' s'applique.
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.
2 votes
Considérer ce que chacun de ces mots-clés fait pour les autres méthodes. Parfois, cela n'a aucun sens dans le contexte d'un constructeur, d'autres fois, c'est déjà implicite.
4 votes
Pourquoi voulez-vous un constructeur statique ? Cette question semble être un problème de devoir.