Initialisation des champs dans les constructeurs Java
En Java, l'ordre d'exécution de l'initialisation des champs et du code du constructeur a été un sujet de confusion. Le code fourni démontre ce comportement :
class X { Y b = new Y(); X() { System.out.print("X"); } } class Y { Y() { System.out.print("Y"); } } public class Z extends X { Y y = new Y(); Z() { System.out.print("Z"); } public static void main(String[] args) { new Z(); } }
On pourrait s'attendre à ce que la sortie soit "XZYY" en partant de l'hypothèse que les constructeurs sont initialisés avant les variables d'instance. Cependant, la sortie réelle est "YYXZ":
Cette sortie contredit l'ordre attendu car l'initialisation du champ (par exemple, 'b' et 'y') se produit avant l'exécution des corps du constructeur (par exemple, 'X()' et ' Z()').
La spécification de la machine virtuelle Java (JVM Spec) clarifie l'ordre d'initialisation comme suit :
Par conséquent, dans le code fourni, les variables d'instance 'b' et 'y' sont initialisées avant que les corps constructeurs de 'X' et 'Z' ne soient exécutés, ce qui entraîne l'exécution du sortie "YYXZ".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!