Quand la classe est-elle chargée ? À la chinoise [chargement impatient] (chargement tant que d'autres classes y font référence) charge une classe, ou cela peut être un chargement paresseux [lazy load] (attendez que l'initialisation de la classe se produise avant le chargement). (Apprentissage recommandé :
cours java) Mais je pense que cela est lié à différentes implémentations JVM, mais il est garanti par JLS (uniquement lorsqu'il y a un besoin d'initialisation statique) chargé).
Quand la classe est-elle initialisée ?Une fois la classe chargée, l'initialisation de la classe aura lieu, ce qui signifie qu'elle initialisera tous les membres statiques de la classe. . Une classe est initialisée dans les situations suivantes :Les instances sont créées à l'aide du mot-clé new() ou à l'aide de la réflexion class.forName(), mais cela peut provoquer une exception ClassNotFoundException.
La méthode statique de la classe est appelée
Le champ statique de la classe est attribué
Le champ statique est accédé, et ce n'est pas une constante
Exécuté dans la classe de niveau supérieur La réflexion de l'instruction assert
peut également initialiser une classe, comme certaines méthodes du package java.lang.reflect indiquent strictement : une classe ne sera initialisée pour aucun. raison autre que celle ci-dessus.
Comment une classe est initialiséeMaintenant, nous savons quand l'initialisation d'une classe est déclenchée, c'est précisément écrit dans la spécification du langage Java. Mais comprenez clairement les champs (champs, statiques ou non statiques), les blocs (statiques ou non statiques), les différentes classes (sous-classes et superclasses) et les différentes interfaces (sous-interfaces, classes d'implémentation et superinterfaces). L'ordre d'initialisation est également important pour cours.
En fait, de nombreuses questions d'entretien Java et questions SCJP sont basées sur ces concepts. Voici quelques règles pour l'initialisation des classes :Initialisation séquentielle des classes de haut en bas. , donc les champs déclarés en haut sont initialisés plus tôt que les champs en basLes super classes sont initialisées plus tôt que les sous-classes et les classes dérivées
Si l'initialisation d'une classe est déclenchée en raison de l'accès à un fichier statique field, alors Seule la classe qui déclare le champ statique est initialisée et ne déclenche pas l'initialisation de la superclasse ou l'initialisation de la sous-classe même si le champ statique est référencé par une sous-classe ou une sous-interface ou sa classe d'implémentation.
L'initialisation de l'interface ne provoque pas l'initialisation de l'interface parent.
Les champs statiques sont initialisés lors de l'initialisation statique de la classe, et les champs non statiques sont initialisés lors de la création des instances de la classe. Cela signifie que les champs statiques sont initialisés avant les champs non statiques.
Les champs non statiques sont initialisés via le constructeur. Le constructeur de la sous-classe appellera implicitement le constructeur de la classe parent avant d'effectuer toute initialisation. Il garantit que les variables non statiques ou d'instance (classe parent) sont initialisées. plus tôt que le cours des enfants
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!