8
votes

Pourquoi Java ne fournit pas de constructeur par défaut, si la classe a un constructeur paramétré?

Pourquoi Java ne fournit pas de constructeur par défaut, si la classe a un constructeur paramétré? Considérez l'exemple suivant

class A {
    int a;

    public A() {
    }

    public A(int val) {
        a = val;
    }
}


2 commentaires

Je ne pense pas que ce soit un duplicata; Il demande pourquoi la spécification dit ce qu'il fait.


@OrgeGedog La difficulté Voici que la réponse littérale à la question de l'OP est "Un compilateur ne génère pas de constructeur par défaut lorsque vous définissez explicitement un constructeur car la définition d'un constructeur par défaut est" l'un du compilateur définit lorsque vous ne le faites pas Définissez un autre '". (Leur public a () {} n'est pas un constructeur par défaut.) L'OP était probablement en train de mélanger la terminologie et probablement sur des constructeurs sans argument. Peut-être que la question devrait être éditée si nous voulons assumer que l'OP mélangeait la terminologie.


4 Réponses :


2
votes

Java vous donnera un constructeur par défaut si votre classe ne définit aucun.

Si vous avez tout constructeur défini, (même un sans aucun argument), le compilateur ne vous donnera pas un autre.

Cela fonctionne comme ceci car il a été spécifié de cette façon. Vous pouvez en savoir plus à ce sujet dans le Spécification de la langue


1 commentaires

OP sait que Java ne fournit pas constructeur par défaut, si la classe a un constructeur paramétré . La question est "pourquoi"?



10
votes

La raison concerne une combinaison de sécurité et d'interface. Le compilateur ne devrait pas vous donner des méthodes que vous ne définissez pas explicitement. La seule exception est un constructeur de commodité No-Arg si vous ne spécifiez aucun constructeur. Si vous spécifiez un constructeur, le compilateur suppose que vous n'en voulez pas d'autres.


0 commentaires

6
votes

Parce que cela briserait la conception de la classe si le compilateur ne fournirait automatiquement aucun constructeur argore à chaque classe. Considérez la classe Scanner. Il possède peu de constructeurs, où vous pouvez spécifier de l'endroit où vous souhaitez lire les données. Si le compilateur n'ajoutait pas non plus de constructeur argileur, après avoir invoqué l'une des données de lecture de scanner pour lire des données d'un objet initialisé avec ce constructeur, une exception serait lancée, car la source de données ne serait pas spécifiée.


0 commentaires

2
votes

Il y a des situations dans lesquelles il serait indésirable d'avoir un constructeur par défaut. La langue doit fournir un moyen de dire au compilateur de ne pas le générer. L'utilisation d'un indicateur autre que la présence d'un constructeur explicite entraînerait des problèmes tels que la nécessité de spécifier un constructeur chaque fois que la valeur par défaut est désactivée.

L'agencement en cours élimine ce problème en veillant à ce qu'il y ait un autre constructeur chaque fois que la valeur par défaut est désactivée.


0 commentaires