Quand les champs statiques sont-ils initialisés? Si je n'instancie jamais une classe, mais que j'accède à un champ statique, TOUS les blocs statiques et les méthodes statiques privées utilisés pour instancier les champs statiques privés sont-ils appelés (dans l'ordre) à cet instant?
Et si j'appelle une méthode statique? Exécute-t-il également tous les blocs statiques? Avant la méthode?
java
static
initialization
Tony R
la source
la source
Réponses:
L'initialisation statique d'une classe se produit normalement juste avant la première fois que l'un des événements suivants se produit:
pour une classe de niveau supérieur, une instruction assert imbriquée lexicalement dans la classe est exécutée1 .Voir JLS 12.4.1 .
Il est également possible de forcer une classe à s'initialiser (si elle ne l'a pas déjà été) en utilisant
Class.forName(fqn, true, classLoader)
ou la forme courteClass.forName(fqn)
1 - La dernière puce était présente dans le JLS pour Java 6 à Java 8, mais c'était apparemment une erreur dans la spécification. Il a finalement été corrigé dans le JLS Java 9: voir source .
la source
String
s sont substitués et non référencés. Si vous référencez aclass Other { public static final int VAL = 10; }
d'une classeMyClass { private int = Other.VAL; }
, la classeOther
ne sera pas chargée. Au lieu de cela, le compilateur remplacera simplement le champ final au moment de la compilation.String
variables «finales statiques» , seulement celles initialisées par une expression constante.static
alors que c'est un cas courant.Les champs statiques sont initialisés lors de la "phase" d' initialisation du chargement de la classe (chargement, liaison et initialisation) qui comprend des initialiseurs statiques et des initialisations de ses champs statiques. Les initialiseurs statiques sont exécutés dans un ordre textuel tel que défini dans la classe.
Prenons l'exemple:
Le Test.b s'imprime
null
car lorsque le asayHello
été appelé dans la portée statique, la variable statiquea
n'a pas été initialisée.la source
Oui, tous les initialiseurs statiques sont exécutés avant que vous n'accédiez à la classe pour la première fois. S'il en était autrement, j'appellerais cela un bug.
la source