¿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 instanciar los 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?
java
static
initialization
Tony R
fuente
fuente
Respuestas:
La inicialización estática de una clase normalmente ocurre inmediatamente antes de la primera vez que ocurre uno de los siguientes eventos:
para una clase de nivel superior, se ejecuta una declaración de aserción anidada léxicamente dentro de la clase1 .Consulte 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)
1 - La viñeta final estaba presente en el 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 .
fuente
String
s están sustituidos y no se hace referencia. Si hace referencia a unaclass Other { public static final int VAL = 10; }
de alguna claseMyClass { private int = Other.VAL; }
, la claseOther
no se cargará. En cambio, el compilador simplemente sustituirá el campo final en el momento de la compilación.String
variables 'estáticas finales' , solo las inicializadas por una expresión constante.static
mientras este es un caso común.Los campos estáticos se inicializan durante la "fase" de inicialización de la carga de clases (carga, vinculación e inicialización) que incluye inicializadores estáticos e inicializaciones de sus campos estáticos. Los inicializadores estáticos se ejecutan en un orden textual como se define en la clase.
Considere el ejemplo:
Test.b se imprime
null
porque cuandosayHello
se llamó en el ámbito estático, la variable estáticaa
no se inicializó.fuente
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.
fuente