Contenu du cours
Java Avancé
Java Avancé
Constructeur
Comment simplifier l'initialisation d'une classe ?
Initialiser chaque champ à chaque fois peut être fastidieux. Pour cela, les classes disposent de constructeurs. La syntaxe d'un constructeur est la suivante :
Main.java
modifier ClassName(ParameterType parameter1, ParameterType parameter2) { this.parameter1 = parameter1; this.parameter2 = parameter2; }
Examinons chaque mot utilisé ici :
modifier
: Il s'agit du modificateur d'accès, qui est souventpublic
pour les constructeurs. Les cas où un constructeur peut avoir un autre modificateur d'accès seront abordés dans un cours séparé ;ClassName
: Il s'agit simplement du nom de la classe dans laquelle vous créez ce constructeur ;ParameterType
: Il s'agit du type de paramètre qui sera utilisé dans le constructeur. Il est important d'y prêter attention, car ce paramètre doit être du même type que le champ dans la classe ; Par exemple : Si la classe possède deux paramètres,String name
etint age
, alors le constructeur doit avoir les mêmes paramètres (si l'on souhaite initialiser tous les champs via le constructeur). Si l'on souhaite initialiser uniquement un champ spécifique de la classe via le constructeur, par exemplename
, alors il faut utiliser un seul paramètre avec le même type et le même nom que le champ dans la classe ;- Ensuite, à l'intérieur du corps du constructeur, on assigne des valeurs aux champs de la classe en utilisant les valeurs passées en paramètre.
Mot-clé "this"
À l'aide du mot-clé this
, il est possible de faire référence à l'attribut de la classe dans laquelle la valeur de ce mot-clé est utilisée. Par exemple, lorsqu'une classe possède deux attributs : name
et age
, il est possible d'écrire this.name
à l'intérieur du constructeur ou d'une méthode, ce qui fera spécifiquement référence à l'attribut de la classe, et non à la variable locale transmise en paramètre à ce constructeur ou à cette méthode. Ainsi, il est possible d'initialiser les attributs de la classe via le constructeur en utilisant la syntaxe : this.name = name;
.
Exemple
Voici un exemple de constructeur dans une classe qui permet d'initialiser tous les attributs afin de clarifier ce concept :
Person.java
class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } }
Nous avons une classe appelée Person
avec trois attributs. Chacun de ces attributs a été ajouté au constructeur à l'aide du mot-clé this
. Ainsi, le constructeur initialise les attributs avec les valeurs des paramètres. Utilisons ce constructeur dans la méthode main
afin d'observer que les attributs sont initialisés avec les valeurs transmises en paramètres :
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); } }
Nous avons initialisé l'objet Person
nommé bob
en utilisant le constructeur en passant le name
, age
et gender
en tant que paramètres. Ensuite, nous avons affiché ses paramètres à l'écran et constaté que l'objet possède les valeurs de champs spécifiées dans les paramètres du constructeur.
Surcharge du constructeur
Le constructeur peut également être surchargé et ne pas couvrir l'initialisation de tous les champs de la classe. Par exemple, si nous ne souhaitons pas spécifier le genre d'Alice, nous pouvons surcharger le constructeur pour accepter uniquement 2 paramètres et initialiser les champs avec ceux-ci :
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); } }
On peut en conclure qu'un constructeur, comme une méthode, peut être surchargé et accepter différents nombres et types de paramètres.
Constructeur par défaut
Un constructeur par défaut est un constructeur qui ne prend aucun paramètre et n'initialise aucun champ. Il existe dans toutes les classes par défaut si elles ne possèdent pas d'autre type de constructeur, c'est pourquoi on l'appelle le constructeur par défaut. Chaque fois que nous créons un objet d'une classe, nous utilisons un constructeur. Afin d'utiliser le constructeur par défaut lorsque nous avons déjà un constructeur qui accepte des paramètres, il est également nécessaire d'écrire un constructeur vide :
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); Person john = new Person(); System.out.println("John's name: " + john.name + ", John's age: " + john.age); } }
Nous utilisons trois constructeurs différents pour initialiser chacun des objets Person
. Comme nous pouvons le voir dans le dernier exemple, John
n'a ni nom ni âge car ces champs ne sont pas initialisés pour l'objet. Ainsi, il est possible de surcharger le constructeur autant de fois que nécessaire et de créer des objets via celui-ci.
1. Laquelle des affirmations suivantes concernant les constructeurs est vraie ?
2. Quel est le but d'un constructeur en Java ?
3. Lequel des extraits de code suivants montre la bonne façon de créer un constructeur paramétré ?
Merci pour vos commentaires !