¿Cuándo ocurre la inicialización estática?

Resuelto Tony R asked hace 14 años • 3 respuestas

¿Cuándo se inicializan los campos estáticos? Si nunca creo una instancia de una clase, pero accedo a un campo estático, ¿TODOS los bloques estáticos y los métodos estáticos privados utilizados para crear instancias de campos estáticos privados se llaman (en orden) en ese instante?

¿Qué pasa si llamo a un método estático? ¿También ejecuta todos los bloques estáticos? ¿Antes del método?

Tony R avatar Aug 17 '10 10:08 Tony R
Aceptado

La inicialización estática de una clase normalmente ocurre inmediatamente antes de que ocurra por primera vez uno de los siguientes eventos:

  • se crea una instancia de la clase,
  • se invoca un método estático de la clase,
  • se asigna un campo estático de la clase,
  • se utiliza un campo estático no constante, o
  • para una clase de nivel superior, se ejecuta una declaración de afirmación anidada léxicamente dentro de la clase 1 .

Ver JLS 12.4.1 .

También es posible forzar la inicialización de una clase (si aún no se ha inicializado) usando Class.forName(fqn, true, classLoader)o la forma cortaClass.forName(fqn)


¿Cuándo ocurre la inicialización de la clase estática?

Véase más arriba.

¿Cuándo se inicializan los campos estáticos?

Como parte de la inicialización de clases estáticas; véase más arriba.

Si nunca creo una instancia de una clase, pero accedo a un campo estático, ¿TODOS los bloques estáticos y los métodos estáticos privados utilizados para crear instancias de campos estáticos privados se llaman (en orden) en ese instante?

Sí. (Módulo que nada es verdaderamente instantáneo).

¿Qué pasa si llamo a un método estático? ¿También ejecuta todos los bloques estáticos? ¿Antes del método?

Si y si.


Tenga en cuenta que es posible construir código donde pueda observar el valor inicializado predeterminado de un campo estático.


1 - El último punto estaba presente en JLS para Java 6 a Java 8, pero aparentemente fue un error en la especificación. Finalmente se corrigió en Java 9 JLS: ver fuente .

Stephen C avatar Aug 17 '2010 04:08 Stephen C

Sí, todos los inicializadores estáticos se ejecutan antes de acceder a la clase por primera vez. Si fuera de otra manera, lo llamaría error.

Nikita Rybak avatar Aug 17 '2010 03:08 Nikita Rybak