Récemment, je lis Penser en Java, et je n'ai jamais prêté attention à l'initialisation de chaque membre de la classe. je l'enregistrerai ici et s'il y a des erreurs, veuillez me corriger :
Comprenez l'ensemble du processus d'initialisation, y compris l'héritage, donc. comme avoir une vision globale de tout ce qui se passe. La compréhension est très bénéfique.
En Java, le code compilé de chaque classe existe dans son propre fichier indépendant (c'est-à-dire le fichier de classe), qui n'est chargé que lorsque le code du programme est nécessaire. De manière générale, « le code de la classe est chargé lors de sa première utilisation », ce qui inclut généralement les deux situations suivantes :
Lorsque le premier objet de la classe est créé
Lors de l'accès à des méthodes ou des champs statiques
Remarque : lorsqu'une classe est utilisée pour la première fois, c'est également là que se produit l'initialisation statique. Tous les objets et codes sont initialisés dans l'ordre dans lequel ils sont écrits, les champs définis comme statiques ne seront initialisés qu'une seule fois.
Sans plus tarder, les détails sont les suivants :
public class Base { //static字段 private static int I1 = printInt("Init I1"); //普通字段 private int i = 11; protected int j; public Base(){ System.out.println("Base constructor"); System.out.println("i="+i+" j="+j); j = 40; } static int printInt(String str) { System.out.println(str); return 10; } } public class Son extends Base{ private static int I2 = printInt("Init I2"); public Son() { System.out.println("Son constructor"); System.out.println("I2="+I2+" j= "+j); } public static void main(String[] args) { Son son = new Son(); } }
Après avoir lu ce code, que pensez-vous du résultat ?
Donnez d'abord la réponse, puis analysez :
Init I1 Init I2 Base constructori=11 j=0Son constructorI2=10 j= 40
Le programme démarre d'abord avec la méthode principale de la classe Son, donc le chargeur démarre et découvre que Son compile le code (c'est-à-dire le fichier de classe). Pendant le processus de chargement, nous avons constaté que Son avait également une classe parent Base, nous continuons donc à charger le code compilé de Base (si Base a toujours une classe parent, continuez à exécuter vers le haut, ensuite le champ statique de la base racine). La classe est initialisée, car la sous-classe peut dépendre de la classe de base. La question de savoir si les membres peuvent être initialisés correctement, donc Init I1
se produit, puis descend jusqu'à Son, le champ statique de la classe Son est initialisé, donc Init I2
se produit. À ce stade, toutes les classes nécessaires sont chargées et l'initialisation de l'objet peut commencer. En voyant la ligne de code Son son = new Son()
, nous sommes prêts à appeler le constructeur de Son. Nous savons que dans la relation d'héritage, super() sera appelé dans le constructeur de la sous-classe. Cela reviendra à la classe parent, mais avant de terminer le constructeur, tous les champs ordinaires (c'est-à-dire les champs non statiques) de la classe parent (Base) termineront leur propre initialisation, vous verrez donc la sortie i=11 j=0
, puis viendrez Pour la sous-classe (Son), le processus d'exécution est le même que pour la classe parent, terminez d'abord l'initialisation des champs ordinaires, puis appelez la méthode constructeur.
J'en ai beaucoup dit, le processus global est le suivant :
Commencez à partir de l'entrée du programme, chargez la classe (définie comme classe Z ici ), S'il existe une relation d'héritage, récurez vers le haut jusqu'à la classe racine (en supposant ici la classe A).
Terminez l'initialisation du champ statique de la classe A et récurez vers le bas jusqu'à ce que vous rencontriez la classe Z.
Terminez l'initialisation du domaine commun de la classe A, complétez le constructeur de la classe A et récurez vers le bas jusqu'à ce que la classe Z soit rencontrée.
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!