Un constructeur est une méthode qui est chargé d’initialiser les instances et qui est systématiquement appelé lors de la déclaration d’un objet. C.-à-d. au début de vie de chaque instance.
Pour déclarer un constructeur il suffit d’ajouter une méthode qui a le même nom que le nom de la classe suivit des paramètres nécessaire aux initialisations et suivi de la définition de la méthode en question.
Exemple d’un constructeur
public class Rectangle {
public Rectangle(double hauteur, double largeur) {
}
}
Les constructeurs sont des méthodes comme les autres, mais il existe des différences entre les constructeurs et les méthodes traditionnelles :
- Pas de type de retour (pas même void) c.-à-d. un constructeur ne retourne rien
- Même nom que la classe.
- Invoque systématiquement à chaque fois qu’une instance est créée
Exemple
public class Rectangle {
public double hauteur;
public double largeur;
public Rectangle(double h, double l) {
hauteur = h;
largeur = l;
}
public double surface() {
return largeur * hauteur;
}
}
Vous pouvez remarquer dans l’exemple précèdent qu’il existe deux méthode : la première méthode fait référence au constructeur de la classe avec le même nom que la classe mais sans type de retour. Contrairement à la méthode surface qui retourne valeur de la surface du rectangle.
Initialisation par constructeur
La déclaration avec initialisation d’un objet se fait selon la syntaxe suivant :
Syntaxe
NomClasse objet = new NomClasse(var1,………varn) ;
Rectangle rectangle = new Rectangle(9.2,8.9);
Le mot clé new suivi du nom de la classe fait un appel au constructeur auquel on passe entre parenthèse les différents paramètres nécessaires.
Constructeur par défaut
Nous allons parler maintenant du constructeur par défaut. Un constructeur par defaut est appelé sans que l’on fournisse aucune valeur d’initialisation, aucun paramètre.
Un constructeur par défaut est tout simplement un constructeur qui n’a pas de paramètre.
Voici un exemple de constructeur de la classe Rectangle
Rectangle(){
hauteur = 3.4 ;
largeur = 4.5 ;
}
Rectangle(double c){
hauteur = c ;
largeur = 4.5 * c ;
}
Rectangle(double h, double l){
hauteur = h ;
largeur = l;
}
Les deux derniers constructeurs ne sont pas des constructeurs par défaut car ils ont une liste de paramètre qui est non vide.
Pour invoquer le 3eme constructeur il faut créer une variable de type Rectangle en appelant le constructeur grâce au mot clé new tout en lui passant les paramètres.
Exemple
Rectangle rectangle = new Rectangle(9.2,8.9);
Si aucun constructeur n’est spécifié, le compilateur génère automatiquement une version minimale du constructeur par défaut.
Ce constructeur par défaut par défaut fait un minimum de travail d’initialisation. Il va initialiser tous les attributs de type de base avec les valeurs par défaut comme 0, 0.0 ou false, et pour les objets, eh bien ils seront tous initialisés à null.
Dès l’instant ou on définit un constructeur explicite, qu’il soit par défaut ou non, le constructeur par défaut par défaut disparaît.
Invoquer un autre constructeur
S’il existe plusieurs constructeurs dans une classe, Java permet à n’importe quel constructeur d’invoquer un autre constructeur de la même classe. Ceci se fait au moyen d’une tournure particulière, this.
Donc, on utilise le mot réservé this et entre parenthèses,
On fournit les arguments qui correspondent au constructeur qu’on veut appeler. Cela nous permet d’éviter de dupliquer inutilement du code. Cependant une seule instruction this dans un constructeur est autorisée et que cette instruction this doit être la toute première instruction invoquée. On ne peux pas mettre aucune instruction avant le this.
Il est également possible en java de donnée des valeurs par défaut aux attribut sans passer par aucun constructeur. Ceci se fait au moment de la déclaration des attribut.
public class Rectangle {
public double hauteur = 98.9;
public double largeur = 33.8;
public Rectangle(double h, double l) {
hauteur = h;
largeur = l;
}
public double surface() {
return largeur * hauteur;
}
}
A noter que pour expliciter les intentions de programmation, il est préférable d’initialiser les attributs dans des constructeurs plutôt que de passer par ce genre de tournures.
Constructeur de copie
Le constructeur de copie a donc pour but d’initialiser une instance avec une copie d’une autre instance de la même classe.
Son entête est donc parfaitement défini puisque c’est un constructeur. Donc il a le même nom que le nom de la classe, mais comme il reçoit une autre Instance de la même classe, sa liste de paramètres est réduite à une seule, Un seul paramètre, qui est une autre instance de la même classe.
public class Rectancle {
private double largeur = 9.9;
private double hauteur = 3.8;
public Rectancle(Rectancle autreRectancle){
hauteur = autreRectancle.hauteur;
largeur = autreRectancle.largeur;
}
}
Java ne fournit pas par défaut une version du constructeur de copie, C’est-à-dire que si on ne fait rien de particulier, on n’a pas le droit, comme ça, de faire des copies, donc ce constructeur ici n’existe pas, ce qu’il faut faire C’est, si on veut faire une construction de copie, explicitement, donc, l’écrire.
Le constructeur de copie n’est pas la seule façon de faire Des copies en Java, il existe une façon qui est plus utilisée, qui est donc la méthode clone.