166 votes

Constructeur par défaut de Java

Qu'est-ce qu'un constructeur par défaut ? Pouvez-vous me dire lequel des éléments suivants est un constructeur par défaut et ce qui le différencie de tout autre constructeur ?

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}

272voto

OrangeDog Points 7380

Ni l'un ni l'autre. Si vous le définissez, ce n'est pas la valeur par défaut.

Le constructeur par défaut est le constructeur sans argument généré automatiquement à moins que vous ne définissiez un autre constructeur. Tous les champs non initialisés prendront leur valeur par défaut. Pour votre exemple, cela ressemblerait à ceci en supposant que les types sont String , int y int et que la classe elle-même est publique :

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}

C'est exactement la même chose que

public Module()
{}

Et c'est exactement la même chose que de ne pas avoir de constructeurs du tout. Cependant, si vous définissez au moins un constructeur, le constructeur par défaut n'est pas généré.

Référence : Spécification du langage Java

Si une classe ne contient aucune déclaration de constructeur, un constructeur par défaut sans paramètres formels et sans clause throws est implicitement déclaré.

Clarification

Techniquement, ce n'est pas le constructeur (par défaut ou autre) qui initialise les champs par défaut. Cependant, je le laisse dans la réponse parce que

  • la question comportait une erreur dans les valeurs par défaut, et
  • le constructeur a exactement le même effet, qu'ils soient inclus ou non.

23 votes

Votre déclaration Il initialise tous les champs non initialisés en leur donnant leur valeur par défaut. semble un peu ambiguë. Même si nous mettons des constructeurs explicites (avec des arguments) ou même si nous fournissons un constructeur sans argument, les variables d'instance sont toujours initialisées avec des valeurs par défaut. Je ne pense pas que cela ait quelque chose à voir avec le constructeur par défaut.

0 votes

Tout ce que le constructeur par défaut fait sera fait pour les constructeurs qui ne le font pas eux-mêmes.

2 votes

@OrangeDog Où voyez-vous dans la spécification la déclaration selon laquelle le constructeur nullaire défini par l'utilisateur sans paramètres n'est pas appelé le constructeur par défaut ?

38voto

Jim Points 13533

Un constructeur par défaut est créé si vous ne définissez aucun constructeur dans votre classe. Il s'agit simplement d'un constructeur sans argument qui ne fait rien. Edit : Sauf appeler super()

public Module(){
}

4 votes

Pour être explicite : si vous écrivez votre propre constructeur, Java ne créera pas le constructeur par défaut. Donc si vous avez besoin d'un constructeur avec arguments et d'un constructeur sans arguments (comme le constructeur par défaut), vous devez écrire les deux !

2 votes

Il convient également de noter que si la superclasse ne ont un constructeur sans argument, la sous-classe ne peut pas avoir de constructeur par défaut (parce que Java ne sait pas comment utiliser les constructeurs qui sont présents par défaut).

8 votes

@Sergey Il semble que ce ne soit pas d'accord download.oracle.com/javase/tutorial/java/javaOO/ tout comme wikipedia.

21voto

kem Points 772

Un constructeur par défaut est automatiquement généré par le compilateur si vous ne définissez pas explicitement au moins un constructeur dans votre classe. Vous en avez défini deux, donc votre classe n'a pas de constructeur par défaut.

Par La spécification du langage Java Troisième édition :

8.8.9 Constructeur par défaut

Si une classe contient un constructeur par défaut qui ne prend aucun paramètre est automatiquement fourni...

18voto

Koushik85 Points 11

Bonjour, en fonction de mes connaissances, permettez-moi de clarifier le concept de constructeur par défaut :

Le compilateur fournit automatiquement un fichier pour toute classe sans constructeur. Ce constructeur par défaut appellera le constructeur sans argument de la superclasse. Dans cette situation, le se plaindra si la superclasse n'a pas de constructeur sans argument. vous devez donc vérifier que c'est bien le cas. Si votre classe n'a pas de explicite, alors elle a une superclasse implicite Object, qui possède un constructeur sans argument.

J'ai lu ces informations sur le site Tutoriels Java .

7voto

sunil Points 41

Java fournit un constructeur par défaut qui ne prend aucun argument et n'effectue aucune action ou initialisation particulière, lorsqu'aucun constructeur explicite n'est fourni.

La seule action entreprise par le constructeur implicite par défaut est d'appeler le constructeur de la superclasse à l'aide de l'appel super(). Les arguments du constructeur permettent de fournir des paramètres pour l'initialisation d'un objet.

Voici un exemple de classe de cube contenant 2 constructeurs. (un constructeur par défaut et un constructeur paramétré).

public class Cube1 {
    int length;
    int breadth;
    int height;
    public int getVolume() {
        return (length * breadth * height);
    }

    Cube1() {
        length = 10;
        breadth = 10;
        height = 10;
    }

    Cube1(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
    }

    public static void main(String[] args) {
        Cube1 cubeObj1, cubeObj2;
        cubeObj1 = new Cube1();
        cubeObj2 = new Cube1(10, 20, 30);
        System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
        System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
    }
}

3 votes

Il ne faut jamais procéder de cette manière, mais plutôt écrire ceci dans le constructeur "par défaut". this(10,10,10); qui appellera le second constructeur à l'intérieur du premier, ce qui rendra votre code beaucoup plus propre, plus facile à comprendre et à refactoriser.

0 votes

@Israelg99 Quelle est la terminologie exacte lorsque l'on utilise this(10,10,10); ?

0 votes

@Israelg99 pas d'inquiétude, il s'appelle invocation explicite d'un constructeur ref : docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

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