studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java jvm jls

java - para - manual de programacion android pdf



Carga de clase frente a inicialización de clase (1)

Siempre pensé que la carga de clases y la inicialización de clases son sinónimos y generalmente ocurren a petición cuando la clase que se inicializa / carga se utiliza de una forma u otra por primera vez . Pero ahora sé por esta respuesta en SO con respecto al comportamiento de los archivos estáticos finales que tiene constantes de tiempo de compilación que mi creencia es incorrecta.

Tenga en cuenta lo siguiente, lo que deja bastante claro que la carga de clases y la inicialización son dos mecanismos diferentes.

Como punto lateral, tenga en cuenta la distinción entre la carga de clase y la inicialización de clase: solo la ocurrencia de este último se especifica con precisión por el JLS. La carga de clases puede ocurrir en cualquier momento.

Pero alguien puede explicar la diferencia entre la carga de clases y la inicialización de clases en lenguaje Java. Normalmente, la intuición dice que la inicialización siempre debe ir precedida de la carga, pero estoy completamente equivocado. ¿La inicialización puede ocurrir sin que se cargue una clase?


De la Especificación de la Máquina Virtual de Java, Capítulo 5. Cargando, Vinculando e Inicializando , puedes encontrar esta información (enfatiza la mía):

5.5. Inicialización

Antes de la inicialización, una clase o interfaz debe estar vinculada , es decir, verificada, preparada y, opcionalmente, resuelta.

Yendo hacia atrás a la sección Vínculos

5.4. Enlace

Vincular una clase o interfaz implica verificar y preparar esa clase o interfaz, su superclase directa, sus superinterfaces directas y su tipo de elemento (si es un tipo de matriz), si es necesario. La resolución de referencias simbólicas en la clase o interfaz es una parte opcional de la vinculación. Esta especificación permite una flexibilidad de implementación a la hora de vincular las actividades (y, debido a la recursión, la carga), siempre que se mantengan todas las propiedades siguientes :

  • Una clase o interfaz está completamente cargada antes de vincularse

Entonces, podemos inferir que una clase o interfaz debe cargarse antes de inicializarse .