java - ¿Qué significa realmente "cuando una clase está cargada"?
classloader static-block (3)
Se dice que los bloques estáticos en java se ejecutan solo una vez cuando se carga esa clase. Pero, ¿qué significa realmente? ¿En qué punto es una clase cargada por JVM (Java Virtual Machine)?
¿Es cuando se llama el método principal en esa clase? ¿Y es que todas las súper clases de la misma clase también se cargan cuando el método principal comienza a ejecutarse?
Tenga en cuenta que A se extiende B y B se extiende C. Todos tienen bloques estáticos. Si A tiene el método principal, ¿cuál será la secuencia de ejecución de bloques estáticos?
Creo que el siguiente ejemplo resolverá todos sus problemas:
Antes de que se inicialice una clase, sus superclases se inicializan, si no se han inicializado previamente.
Así, el programa de prueba:
class Super {
static { System.out.print("Super "); }
}
class One {
static { System.out.print("One "); }
}
class Two extends Super {
static { System.out.print("Two "); }
}
class Test {
public static void main(String[] args) {
One o = null;
Two t = new Two();
System.out.println((Object)o == (Object)t);
}
}
huellas dactilares:
Super Two false
La clase Uno nunca se inicializa, porque no se usa activamente y, por lo tanto, nunca se vincula. La clase dos se inicializa solo después de que su superclase Super se haya inicializado.
Para más detalles visita este link
Editar detalles: Se eliminaron las líneas confusas.
De la especificación del lenguaje Java :
La inicialización de una clase consiste en ejecutar sus inicializadores estáticos y los inicializadores para campos estáticos (variables de clase) declarados en la clase. La inicialización de una interfaz consiste en ejecutar los inicializadores para los campos (constantes) declarados allí.
Antes de que se inicialice una clase, se debe inicializar su superclase, pero las interfaces implementadas por la clase no se inicializan. De manera similar, las superinterfaces de una interfaz no se inicializan antes de que la interfaz se inicialice.
El proceso se describe con más detalle en la Especificación de la máquina virtual de Java .
Esto se describe en la sección Execution del JLS. A saber:
La inicialización de una clase consiste en ejecutar sus inicializadores estáticos y los inicializadores para los campos estáticos declarados en la clase. La inicialización de una interfaz consiste en ejecutar los inicializadores para los campos declarados en la interfaz.
Antes de que se inicialice una clase, se debe inicializar su superclase directa , pero no es necesario inicializar las interfaces implementadas por la clase. De manera similar, las superinterfaces de una interfaz no necesitan inicializarse antes de que la interfaz se inicialice.
Entonces, en su ejemplo, el bloque estático de la clase "superior" ( C
) se ejecuta primero, luego el de B
y luego el más derivado.
Consulte esa documentación para obtener una descripción detallada de todos los pasos necesarios para cargar una clase.
(Las clases se cargan cuando se usan activamente por primera vez).