Maison > Java > javaDidacticiel > Quel est l'ordre d'exécution des blocs d'initialisation statiques et d'instance en Java ?

Quel est l'ordre d'exécution des blocs d'initialisation statiques et d'instance en Java ?

Barbara Streisand
Libérer: 2024-11-24 08:28:09
original
875 Les gens l'ont consulté

What's the Execution Order of Static and Instance Initializer Blocks in Java?

Ordre d'exécution des blocs d'initialisation statiques et d'instance en Java

Lorsque vous travaillez avec des classes Java, il est essentiel de comprendre l'ordre dans lequel les classes statiques et les blocs d'initialisation d'instance sont exécutés. Ces blocs effectuent des opérations vitales telles que l'attribution de valeurs initiales et l'initialisation des membres de classe et d'objet.

Blocs d'initialisation d'instance

Les blocs d'initialisation d'instance, entourés d'accolades { }, sont exécutés chaque fois qu'une instance d'une classe est créée. Ils sont exécutés dans l'ordre dans lequel ils apparaissent dans le code de la classe. Ce comportement est cohérent dans toutes les classes.

Blocs d'initialisation statiques

Les blocs d'initialisation statiques, également entourés d'accolades { } et précédés du mot clé static, sont exécutés lorsque la classe est chargée. Ils ne sont associés à aucune instance spécifique et ne sont exécutés qu'une seule fois, quel que soit le nombre d'instances créées.

Ordre d'exécution spécifique

La spécification du langage Java (JLS) définit un ordre spécifique pour l'exécution des blocs d'initialisation statiques :

  1. Les blocs d'initialisation statiques de la classe parent sont exécutés d'abord.
  2. Les blocs d'initialisation statiques de la sous-classe directe sont ensuite exécutés.
  3. Cet ordre est suivi de manière récursive jusqu'à ce que toutes les sous-classes aient exécuté leurs blocs d'initialisation statiques.

Exemple

Considérez le code suivant exemple :

class Grandparent {
    static { System.out.println("Static - Grandparent"); }
}

class Parent extends Grandparent {
    static { System.out.println("Static - Parent"); }
}

class Child extends Parent {
    static { System.out.println("Static - Child"); }
}
Copier après la connexion

Lorsque la méthode principale est exécutée, la sortie suivante est générée :

Static - Grandparent
Static - Parent
Static - Child
Copier après la connexion

Cela démontre que les blocs d'initialisation statiques sont exécutés dans l'ordre parent -> sous-classe.

Exceptions

Il existe une exception notable à cette règle. Si la classe parent définit une classe qui n'est jamais référencée, son bloc d'initialisation statique ne sera pas exécuté. En effet, le chargeur de classes initialise uniquement les classes explicitement requises.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal