2010-05-31 18 views
272

me estaba mirando por encima un poco de código el otro día y me encontré con:estático bloque en Java

static { 
    ... 
} 

Viniendo de C++, no tenía ni idea de por qué estaba allí. No es un error porque el código compilado bien. ¿Qué es este bloque de código "estático"?

+0

Compruebe esto: [Palabra clave estática en java] (http: // programmergate.com/static-keyword-java /) –

Respuesta

298

Es un static initializer. Se ejecuta cuando la clase se carga (o inicializa, para ser precisos, pero por lo general no se nota la diferencia).

Se puede considerar como un "constructor de clase".

Tenga en cuenta que también hay instance initializers, que tienen el mismo aspecto, excepto que no tienen la palabra clave static. Se ejecutan además de el código en el constructor cuando se crea una nueva instancia del objeto.

+9

Entonces, ¿por qué usaría un inicializador de instancias no estáticas y no simplemente haría uso del constructor de la clase (puedo pensar que esto es útil en clases anónimas)? – Jori

+47

@Jori: una razón común es si tiene múltiples constructores separados (que * do not * simplemente "redirige" a uno único canónico) y desea que todos tengan cierta inicialización en común. –

+2

Hace que el código sea más claro y menos repetitivo. Las personas que hacen las especificaciones de Java a veces hacen las cosas más confusas, pero casi siempre hay una razón subyacente de por qué lo hicieron de esa manera. Manipulación de corriente, ¿alguien? – Mindwin

66

Es un bloque de código que se ejecuta cuando la clase es cargada por un cargador de clases. Está destinado a hacer la inicialización de los miembros estáticos de la clase.

También es posible escribir inicializadores no estáticos, que se ven aún más extraño:

public class Foo { 
    { 
     // This code will be executed before every constructor 
     // but after the call to super() 
    } 

    Foo() { 

    } 
} 
+1

Esto parece un constructor ** normal **. –

+9

@DerGolem Creo que se está refiriendo a las llaves sobre el constructor normal. – saadq

+3

Ni siquiera me di cuenta de eso ...;) ¡Sí, raro! –

84

Es un inicializador estático. Se ejecuta cuando la clase está cargada y es un buen lugar para poner inicialización de variables estáticas.

De http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html

Una clase puede tener cualquier número de bloques de inicialización estática, y pueden aparecer en cualquier parte del cuerpo de la clase. El sistema de tiempo de ejecución garantiza que los bloques de inicialización estáticos se invoquen en el orden en que aparecen en el código fuente.

Si usted tiene una clase con un mapa estático de consulta que podría tener este aspecto

class MyClass { 
    static Map<Double, String> labels; 
    static { 
     labels = new HashMap<Double, String>(); 
     labels.put(5.5, "five and a half"); 
     labels.put(7.1, "seven point 1"); 
    } 
    //... 
} 

Es útil ya que el campo estático anterior no podría haber sido inicializado usando labels = .... Necesita llamar al método put de alguna manera.

+0

@aioobe Entiendo que podría no ser necesario, pero nunca se sabrá de los inicializadores estáticos sin estar expuesto a ellos. Además, en algunos casos, la iniciación de miembros de la clase en la declaración no se fomenta (algunas empresas para las que trabajé), y la inicialización dentro del bloque estático o en el constructor (para miembros no estáticos) fue la práctica recomendada. – Mindwin

+0

Ya veo. ¿Por qué está desalentado? Personalmente encuentro que la inicialización de miembros en la declaración es bastante fácil de leer y mantener. Yo diría que forzarlos a los constructores puede ser una mala idea, especialmente si tiene más de un constructor y necesita repetir la inicialización. (Si, por ejemplo, cambia de ArrayList a LinkedList, debe recordar cambiarlo en varios lugares). – aioobe

+0

Como dijo, tenemos que repetir el código de inicialización en cada constructor. Sería mejor si los inicializáramos en los inicializadores de instancias. – user12458

6

Un bloque estático se ejecuta una vez en el ciclo de vida de cualquier programa, otra propiedad del bloque estático es que se ejecuta antes que el método principal.

14

El bloque estático se puede utilizar para mostrar que un programa también se puede ejecutar sin función principal.

//static block 
//static block is used to initlize static data member of the clas at the time of clas loading 
//static block is exeuted before the main 
class B 
{ 
    static 
    { 
     System.out.println("Welcome to Java"); 
     System.exit(0); 
    } 
} 
+6

esto solo es cierto hasta la versión 7, donde está obligado a escribir una main si desea ejecutar el código. – XFCC

-2

sí, el bloque estático se usa para inicializar el código y se cargará en el momento en que JVM se inicie para su ejecución.

bloque estático se utiliza en versiones anteriores de java, pero en la última versión no funciona.

+2

no cuando se inicia JVM, pero cuando se carga la clase. JVM utiliza un mecanismo de carga de clase para que cargue la clase cuando se usa, no antes y nunca cuando se inicia la JVM. – 4lberto

Cuestiones relacionadas