Le type de retour du constructeur en Java

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons nous concentrer sur le type de retour pour un constructeur en Java.

Tout d'abord, nous nous familiariserons avec le fonctionnement de l'initialisation des objets dans Java et la JVM. Ensuite, nous allons creuser plus profondément pour voir comment l'initialisation et l'affectation d'objets fonctionnent sous le capot.

2. Initialisation de l'instance

Commençons par une classe vide:

public class Color {}

Ici, nous allons créer une instance à partir de cette classe et l'assigner à une variable:

Color color = new Color();

Après avoir compilé ce simple extrait de code Java, jetons un coup d'œil à son bytecode via la commande javap -c :

0: new #7 // class Color 3: dup 4: invokespecial #9 // Method Color."":()V 7: astore_1

Lorsque nous instancions un objet en Java, la JVM effectue les opérations suivantes:

  1. Premièrement, il trouve une place dans son espace de processus pour le nouvel objet.
  2. Ensuite, la machine virtuelle Java exécute le processus d'initialisation du système. Dans cette étape, il crée l'objet dans son état par défaut. Le nouvel opcode dans le bytecode est en fait responsable de cette étape.
  3. Enfin, il initialise l'objet avec le constructeur et d'autres blocs d'initialisation. Dans ce cas, l' opcode invokespecial appelle le constructeur.

Comme indiqué ci-dessus, la signature de méthode pour le constructeur par défaut est:

Method Color."":()V

le est le nom des méthodes d'initialisation d'instance dans la JVM . Dans ce cas, leest une fonction qui:

  • ne prend rien comme entrée (parenthèses vides après le nom de la méthode)
  • ne renvoie rien (V signifie vide )

Par conséquent, le type de retour d'un constructeur en Java et JVM est vide.

Jetons un autre regard sur notre mission simple:

Color color = new Color();

Maintenant que nous savons que le constructeur retourne void , voyons comment fonctionne l'affectation.

3. Comment fonctionne l'affectation

JVM est une machine virtuelle basée sur la pile. Chaque pile se compose de cadres de pile. En termes simples, chaque frame de pile correspond à un appel de méthode. En fait, JVM crée des cadres avec un nouvel appel de méthode et les détruit à mesure qu'ils terminent leur travail:

Chaque frame de pile utilise un tableau pour stocker les variables locales et une pile d'opérandes pour stocker des résultats partiels . Compte tenu de cela, jetons un autre regard sur le bytecode:

0: new #7 // class Color 3: dup 4: invokespecial #9 // Method Color."":()V 7: astore_1

Voici comment fonctionne le devoir:

  • La nouvelle instruction crée une instance de Color et pousse sa référence sur la pile d'opérandes
  • L' opcode dup duplique le dernier élément de la pile d'opérandes
  • Le invokespecial prend la référence dupliquée et la consomme pour l'initialisation. Après cela, seule la référence d'origine reste sur la pile d'opérandes
  • L' astore_1 stocke la référence d'origine à l'index 1 du tableau de variables locales. Le préfixe «a» signifie que l'élément à stocker est une référence d'objet et le «1» est l'index du tableau

Désormais, le deuxième élément (index 1) du tableau des variables locales est une référence à l'objet nouvellement créé . Par conséquent, nous ne perdons pas la référence et l'affectation fonctionne réellement - même si le constructeur ne renvoie rien!

4. Conclusion

Dans ce rapide didacticiel, nous avons appris comment la JVM crée et initialise nos instances de classe. De plus, nous avons vu comment l'initialisation de l'instance fonctionne sous le capot.

Pour une compréhension encore plus détaillée de la JVM, il est toujours judicieux de consulter ses spécifications.