web-dev-qa-db-fra.com

Pourquoi les constructeurs ne peuvent pas être final

Pourquoi les constructeurs ne peuvent-ils pas être finaux, statiques ou abstraits en Java?

Par exemple, pouvez-vous m'expliquer pourquoi cela n'est pas valable?

public class K {

    abstract public K() {
        // ...
    }
}
69
sachin

Lorsque vous définissez une méthode sur final, cela signifie: "Je ne veux pas qu'une classe la remplace." Mais selon les spécifications 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 peuvent donc pas être masquées ou annulées."

Lorsque vous définissez une méthode sur abstract, cela signifie: "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 le mot clé new est utilisé afin de ne pas manquer de corps.

Lorsque vous définissez une méthode sur static, cela signifie: "Cette méthode appartient à la classe, pas à un objet particulier." Mais le constructeur est appelé implicitement pour initialiser un objet, il n'y a donc aucun intérêt à avoir un constructeur statique.

151
user1232256

La question est vraiment pourquoi vous voulez que le constructeur soit static or abstract or final.

Les constructeurs ne sont pas hérités, ils ne peuvent donc pas être remplacés. avoir le constructeur final

Le constructeur est appelé automatiquement lorsqu'une instance de la classe est créé, il a accès aux champs d'instance de la classe. Ce qui sera l'utilisation d'un constructeur statique.

Le constructeur ne peut pas être remplacé alors que ferez-vous avec un résumé constructeur.

39
RanRag

Un constructeur Java est implicitement final, les aspects statique/non statique de sa sémantique sont implicite 1et il est sans signification pour un constructeur Java d'être abstrait.

Cela signifie que les modificateurs final et static seraient redondants et que le mot clé abstract n'aurait aucune signification.

Naturellement, les concepteurs Java ne voyaient aucun moyen d'autoriser des modificateurs d'accès redondants et/ou sans signification sur les constructeurs ... ils ne sont donc pas autorisés par la grammaire Java. 

De plus, il est dommage qu'ils n'aient pas fait le même appel de conception pour les méthodes d'interface où les modificateurs public et abstract sont également redondants, mais autorisés malgré tout. Peut-être y a-t-il une raison historique (ancienne) à cela. Mais dans tous les cas, il ne peut pas être corrigé sans rendre incompatibles (probablement) des millions de programmes Java existants.


1 - En réalité, 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, ni substituables. Ceci est similaire au fonctionnement des méthodes statiques. D'autre part, le corps d'un constructeur peut faire référence à this et appeler des méthodes d'instance ... comme une méthode d'instance. Et puis il y a le chaînage des constructeurs, qui est unique aux constructeurs. Mais le vrai problème est que ces sémantiques sont fixes et qu’il est inutile de permettre un modificateur static redondant et probablement déroutant.

14
Stephen C
  • 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 package.

  • Constructeur protected: Les objets peuvent être créés par des classes extérieures au package 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).

Les mots clés static, final et abstract n'ont pas de sens pour un constructeur, car:

  • Les membres static appartiennent à une classe, mais le constructeur est nécessaire pour créer un objet.

  • Une classe abstract est une classe partiellement implémentée, qui contient des méthodes abstraites à implémenter dans une classe enfant.

  • final limite les modifications: les variables deviennent constantes, les méthodes ne peuvent pas être remplacées et les classes ne peuvent pas être héritées.

9
mahesh

Aucun constructeur ne peut JAMAIS être déclaré final. Votre compilateur donnera toujours une erreur du type "modificateur final non autorisé" Final, appliqué aux méthodes, signifie que la méthode ne peut pas être remplacée dans une sous-classe. Les constructeurs ne sont PAS des méthodes ordinaires. (Différentes règles s'appliquent) De plus, les constructeurs ne sont JAMAIS hérités. Donc, il n'y a pas de sens à le déclarer final.

6
Jimit Rupani

Final : Parce que vous ne pouvez pas écraser/étendre 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.

Static : Si vous regardez l'exécution, un constructeur n'est pas statique (il peut accéder aux champs d'instance), si vous regardez côté appelant, il est (en quelque sorte) statique (vous l'appelez sans avoir d'instance. C'est dur imaginer un constructeur complètement statique ou non statique et sans séparation sémantique entre ces deux choses n'a pas de sens de les distinguer avec un modificateur.

Abstract : L'abrégé n'a de sens qu'en présence de réécriture/extension, de sorte que le même argument que pour 'final' s'applique

6
Jens Schauder
  1. Les constructeurs ne sont PAS des méthodes ordinaires. (des règles différentes s'appliquent)
  2. De plus, les constructeurs ne sont JAMAIS hérités. Il n’ya donc aucun sens à le déclarer final . Aucun constructeur ne peut JAMAIS être déclaré final. Votre compilateur donnera toujours une erreur du type "modifer final not allowed"
  3. Consultez la section 8.8.3 de JLS (les documents JLS et API devraient constituer certaines de vos sources d'informations principales).
3
jaskirat Singh

JLS la section 8 mentionne ceci.

Les constructeurs (§8.8) sont similaires aux méthodes, mais ne peuvent pas être invoqués directement par un appel de méthode; ils sont utilisés pour initialiser une nouvelle classe les instances. Comme les méthodes, elles peuvent être surchargées (§8.8.8).

Mais les constructeurs eux-mêmes ne sont pas des méthodes régulières. Ils ne peuvent pas être comparés comme tels.

2
Oh Chin Boon

pourquoi constructeur ne peut pas être statique et final sont bien définis dans les réponses ci-dessus. 

Résumé: "Résumé" signifie aucune mise en oeuvre. et cela ne peut être implémenté que par héritage. Ainsi, lorsque nous étendons une classe, tous les membres de la classe parent sont hérités de la sous-classe (classe enfant), à l'exception de "Constructor". Supposons donc que vous parveniez à déclarer le constructeur "Résumé", puis comment pouvez-vous donner son implémentation dans une sous-classe, lorsque le constructeur n'est pas hérité dans une classe enfant? 

c'est pourquoi le constructeur ne peut pas être abstrait. 

1
Muneeb Nasir

permet de voir d'abordfinal public K () {

* au-dessus du modificateur final est restreint parce que s'il est définitif alors une situation où, dans une autre classe ou dans la même classe, nous allons seulement la remplacer afin que cela ne se produise pas ici non finaleg:

we want public void(int i,String name){
//this code not allowed

laissez static , static itz tout sur le niveau de la classe mais nous créons le constructeur basé sur les objets en utilisant le mot-clé 'new' donc , thatsall

résumé Itz pire ici pas à cause parce que pas de méthode abstraite ou toute méthode déclarée

0
veeresh kalyan