Apprenez l'utilisation de this () et (super) dans Java Constructor Chaining

Le chaînage de constructeur en Java est simplement l'acte d'un constructeur appelant un autre constructeur via l'héritage. Cela se produit implicitement lors de la construction d'une sous-classe: sa première tâche consiste à appeler la méthode constructeur de son parent. Mais les programmeurs peuvent également appeler un autre constructeur explicitement en utilisant les mots clés cette() ou super(). le cette() le mot clé appelle un autre constructeur surchargé de la même classe; le super() mot-clé appelle un constructeur non par défaut dans une superclasse.

Chaînage implicite de constructeur

Le chaînage de constructeur se produit par l'utilisation de l'héritage. La première tâche d'une méthode de constructeur de sous-classe consiste à appeler la méthode de constructeur de sa super-classe. Cela garantit que la création de l'objet de sous-classe commence par l'initialisation des classes au-dessus de lui dans la chaîne d'héritage.

Il peut y avoir un certain nombre de classes dans une chaîne d'héritage. Chaque méthode constructeur appelle la chaîne jusqu'à ce que la classe du haut soit atteinte et initialisée. Ensuite, chaque classe suivante ci-dessous est initialisée lorsque la chaîne revient à la sous-classe d'origine. Ce processus est appelé chaînage constructeur.

Notez que:

  • Cet appel implicite à la superclasse est le même que si la sous-classe avait inclus le super() mot-clé, c'est-à-dire. super() est implicite ici.
  • Si un constructeur sans argument n'est pas inclus dans la classe, Java en crée un en arrière-plan et l'invoque. Cela signifie que si votre seul constructeur prend un argument, vous devez explicitement utiliser un cette() ou super() mot-clé pour l'invoquer (voir ci-dessous).

Considérez cette superclasse animale étendue par les mammifères:

classe Animal 
// constructeur
Animal()
 System.out.println ("Nous sommes dans le constructeur de la classe Animal.");

classe Mammifère étend Animal 
//constructeur
Mammifère()
 System.out.println ("Nous sommes dans le constructeur de classe Mammal.");

Maintenant, instancions la classe Mammal:

public class ChainingConstructors 
 / **
* @param args
* /
public static void main (String [] args)
Mammifère m = nouveau Mammifère ();

Lorsque le programme ci-dessus s'exécute, Java déclenche implicitement un appel au constructeur Animal de la superclasse, puis au constructeur de la classe. Le résultat sera donc:

Nous sommes en classe constructeur d'Animal
Nous sommes dans le constructeur de classe Mammal

Chaîne de constructeur explicite utilisant this () ou super ()

Utilisation explicite du cette() ou super() les mots clés vous permettent d'appeler un constructeur non par défaut.

  • Pour appeler un constructeur par défaut non-args ou un constructeur surchargé à partir de la même classe, utilisez le cette() mot-clé. 
  • Pour appeler un constructeur de superclasse non par défaut à partir d'une sous-classe, utilisez le super() mot-clé. Par exemple, si la superclasse a plusieurs constructeurs, une sous-classe peut toujours vouloir appeler un constructeur spécifique, plutôt que le constructeur par défaut.

Notez que l'appel à un autre constructeur doit être la première instruction du constructeur ou Java générera une erreur de compilation.

Considérez le code ci-dessous dans lequel une nouvelle sous-classe, Carnivore, hérite de la classe Mammal qui hérite de la classe Animal, et chaque classe a maintenant un constructeur qui prend un argument.

Voici l'animal superclasse: 

public class Animal
nom de chaîne privé;
public Animal (String name) // constructeur avec un argument

this.name = nom;
System.out.println ("Je suis exécuté en premier.");

Notez que le constructeur prend maintenant un Nom de type Chaîne comme paramètre et que le corps de la classe appelle cette() sur le constructeur. Sans l'utilisation explicite de Ce nom, Java créerait un constructeur par défaut sans argument et l'invoquerait à la place.

Voici la sous-classe Mammal:

public class Mammal étend Animal 
Mammifère public (nom de chaîne)

super (nom);
System.out.println ("Je suis exécuté en second");

Son constructeur prend également un argument, et il utilise super (nom) invoquer un constructeur spécifique dans sa superclasse.

Voici une autre sous-classe Carnivore. Cela hérite de Mammal: 

public class Carnivore étend Mammal 
Carnivore public (nom de chaîne)

super (nom);
System.out.println ("Je suis exécuté en dernier");

Lors de l'exécution, ces trois blocs de code s'impriment:

Je suis exécuté en premier.
Je suis exécuté en second.
Je suis exécuté en dernier.

Récapituler: Lorsqu'une instance de la classe Carnivore est créée, la première action de sa méthode constructeur est d'appeler la méthode constructeur Mammal. De même, la première action de la méthode constructeur Mammal est d'appeler la méthode constructeur Animal. Une chaîne d'appels de méthode constructeur garantit que l'instance de l'objet Carnivore a correctement initialisé toutes les classes de sa chaîne d'héritage.