114 votes

Initialisation de classe statique Java

Question rapide -

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 sont-ils utilisés pour instancier des champs statiques privés appelés (dans l'ordre) à cet instant?

Et si j'appelle une méthode statique? Existe-t-il également tous les blocs statiques? Avant la méthode?

160voto

Stephen C Points 255558

Une des classes d'initialisation statique qui se passe normalement, immédiatement avant la première fois, l'un des événements suivants se produit:

  • une instance de la classe est créée,
  • une méthode statique de la classe est appelée,
  • un champ statique de la classe est affecté,
  • un non-constante de champ statique est utilisé, ou
  • pour un haut-niveau de la classe, une instruction assert lexicalement imbriquée à l'intérieur de la classe est exécutée.

Voir JLS 12.4.1.

Il est également possible de forcer une classe initialiser (si ce n'est pas déjà initialisé) à l'aide de Class.forName(fqn, true, classLoader) ou la forme abrégée Class.forName(fqn)

15voto

naikus Points 11284

Les champs statiques sont initialisés lors de l' initialisation de la "phase" de la classe de chargement (chargement, de liaison et de l'initialisation) qui comprend les initialiseurs statiques et les initialisations de ses champs statiques. Les initialiseurs statiques sont exécutées dans un ordre textuel tel que défini dans la classe.

Prenons l'exemple:

public class Test {

   static String sayHello()  {
      return a;
   }

   static String b = sayHello(); // a static method is called to assign value to b.
                                 // but its a has not been initialized yet.

   static String a = "hello";

   static String c = sayHello(); // assignes "hello" to variable c

    public static void main(String[] arg) throws Throwable {
         System.out.println(Test.b); // prints null
         System.out.println(Test.sayHello()); // prints "hello"
    }
}

Le Test.b imprime null parce que quand l' sayHello a été appelé en statique de la portée, la variable statique a n'a pas été initialisé.

1voto

Nikita Rybak Points 36641

Oui, tous les initialiseurs statiques sont exécutés avant que vous n'accédiez à la classe pour la première fois. Si c'était autrement, j'appellerais ça un bug.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X