2011-12-18 18 views
13

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)?¿Qué significa "Cuando se carga una clase" en realidad?

¿Es cuando se llama al método principal en esa clase? ¿Y es que todas las superclases de la misma clase también se cargan cuando el método principal comienza la ejecución?

Considere 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?

Respuesta

9

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 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 inicializar una clase, su superclase directa se debe inicializar, pero las interfaces implementadas por la clase no necesitan ser inicializadas. De forma similar, las superinterfaces de una interfaz no necesitan inicializarse antes de que se inicialice la interfaz.

Así que en su ejemplo, el bloque estático de la clase "superior" (C) se ejecuta primero, y luego la de B, entonces la más derivado.

Consulte la documentación para obtener una descripción detallada de todos los pasos para cargar una clase.

(. Las clases se cargan cuando se utilizó por primera vez de forma activa)

1

Desde el Java Language Specification:

inicialización de una clase consiste en la ejecución de sus inicializadores estáticos y los inicializadores de campos estáticos (variables de clase) declarado en la clase. La inicialización de una interfaz consiste en ejecutar los inicializadores para los campos (constantes) declarados allí.

Antes de inicializar una clase, su superclase se debe inicializar, pero las interfaces implementadas por la clase no se inicializan. De forma similar, las superinterfaces de una interfaz no se inicializan antes de que se inicialice la interfaz.

El proceso se describe con más detalle en el Java Virtual Machine Specification.

1

creo que el siguiente ejemplo se va a resolver todos sus problemas:

Antes se inicializa una clase, sus superclases se inicializan, si previamente no se han inicializado.

Por lo tanto, 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); 
     } 
} 

impresiones:

Super Two false 

la clase Uno nunca se ha inicializado, ya que no se utiliza de manera activa y por lo tanto nunca está vinculado.La clase Dos se inicializa solo después de que su superclase Super se haya inicializado.

Para más detalles visitar este link

Editar detalles: se ha suprimido líneas confusas.

+0

'Justo después de que se inicie JVM' no es una descripción precisa de este proceso. Ver las otras respuestas Voto abajo. – EJP

+0

Revedó esas líneas confusas –

Cuestiones relacionadas