Maison >Java >javaDidacticiel >Analyse de l'ordre de chargement des classes en Java (couramment utilisé dans les questions d'entretien)
C'est en fait une question de test écrit d'Alibaba que j'ai rencontrée lors du recrutement scolaire l'année dernière (j'avoue que c'est un peu vieux -.-), enfin, si je me souviens bien, c'était une question majeure facultative en direction de Java. Bien sûr, la signification de la question n'est pas si simple. La question vous demande uniquement d'écrire les résultats de sortie de tous les System.out.println après l'exécution du programme. Le programme est donné par la question et les différents ordres d'exécution. chaque System.out.println donnera lieu à la sortie finale du programme. Les résultats sont également différents.
Je ne me souviens certainement pas de la question spécifique, mais nous pouvons modifier la question directement, s'il y a des variables statiques, des blocs d'instructions statiques, des variables non statiques, des blocs d'instructions non statiques et des constructeurs dans la classe A. et la classe B, la méthode statique, la méthode non statique et la classe A héritent de la classe B. Lors de l'instanciation de A, quel est l'ordre de chargement à l'intérieur de la classe ?
J'étais également confus à l'époque et j'en ai écrit un moi-même par la suite. Après une petite démo, je connais maintenant la séquence de chargement réelle à l'intérieur de la classe. Le code du test est le suivant :
Classe B :
public class B{ //静态变量 static int i=1; //静态语句块 static { System.out.println("Class B1:static blocks"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("Class B2:static blocks"+i); } //构造函数 public B(){ i++; j++; System.out.println("constructor B: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("Class B:common blocks"+"i="+i+",j="+j); } //非静态方法 public void bDisplay(){ i++; System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void bTest(){ i++; System.out.println("Class B:static void bTest(): "+"i="+i); return ; } }
Classe A :
.public class A extends B{ //静态变量 static int i=1; //静态语句块 static { System.out.println("Class A1:static blocks"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("Class A2:static blocks"+i); } //构造函数 public A(){ super(); i++; j++; System.out.println("constructor A: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("Class A:common blocks"+"i="+i+",j="+j); } //非静态方法 public void aDisplay(){ i++; System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void aTest(){ i++; System.out.println("Class A:static void aTest(): "+"i="+i); return ; } }
Class ClassLoading :
public class ClassLoading { public static void main (String args[]) { A a=new A(); a.aDisplay(); } }
Le résultat de l'exécution du programme est tel qu'indiqué dans la figure :
Grâce au diagramme ci-dessus, nous peut clairement voir l'ensemble du processus de chargement de la classe Java.
1. Si vous souhaitez charger la classe A, chargez et exécutez d'abord les variables statiques et les blocs d'instructions statiques de sa classe parent B (Objet) (l'ordre d'exécution est dans l'ordre d'arrangement).
2. Chargez ensuite les variables statiques et les blocs d'instructions statiques de la classe d'exécution A. (Et les étapes 1 et 2 ne seront exécutées qu'une seule fois)
3 Si vous devez instancier la classe A, appelez d'abord le constructeur de sa classe parent B, et avant d'appeler le constructeur de sa classe parent B, appelez le Non-. variables statiques et blocs d'instructions non statiques dans la classe parent B. Enfin, appelez le constructeur dans la classe parent B pour l'initialisation.
4. Appelez ensuite les variables non statiques et les blocs d'instructions non statiques de la classe A dans l'ordre. Enfin, appelez le constructeur dans A pour l'initialisation. (Et les étapes 3 et 4 peuvent être répétées)
5. Les méthodes statiques et les méthodes non statiques sont toutes deux des appels passifs, c'est-à-dire que le système ne les appellera pas et ne les exécutera pas automatiquement, elles ne seront donc pas exécutées lorsque l'utilisateur le fera. ne les appelez pas. La principale différence est que les méthodes statiques peuvent être appelées directement en utilisant le nom de la classe (ou les objets instanciés), tandis que les méthodes non statiques ne peuvent être appelées qu'après l'instanciation de l'objet.
OK, c'est le résumé d'aujourd'hui. S'il y a quelque chose qui n'est pas bon ou faux, vous pouvez le signaler et je le corrigerai.
Pour plus d'articles connexes sur l'analyse de l'ordre de chargement des classes en Java (couramment utilisée dans les questions d'entretien), veuillez faire attention au site Web PHP chinois !