2009-10-15 13 views
8

Originalmente pensé que los bloques estáticos eran para variables estáticas, pero el compilador permite compilar y ejecutar tanto A como B, ¿qué ofrece?
UnEn bloques de inicialización estáticos y no estáticos en Java

private static final Map<String,String> m = new HashMap<String,String>(); 

     { 
      m.put("why", "does"); 
      m.put("this","work"); 
     } 

B

private static final Map<String,String> m = new HashMap<String,String>(); 

     static{ 
       m.put("why", "does"); 
       m.put("this","work"); 
      } 

Correr System.out.println(Main.m.toString()); para A impresiones

{}

pero el funcionamiento de la misma para B grabados en Yoda-hablar

{esto = trabajo, ¿por qué lo hace =}

+0

¿Existe una alternativa a los bloques estáticos y no estáticos? –

Respuesta

13

El bloque no estático se ejecuta cuando se crea una "instancia" de la clase.

Así

System.out.println(Main.m.toString()); 

imprime nada porque no se ha creado una instancia.

intente crear una instancia primera

Main main = new Main(); 

y verá el mismo mensaje que B

Como saben variables de clase (declarada usando estática) son de alcance si se utilizan bloques de instancia.

Consulte también:

Anonymous Code Blocks In Java

+0

Lo que tiene perfecto sentido lógico –

6

En A, tiene un inicializador de instancia. Se ejecutará cada vez que construya una nueva instancia de A.

Si varios hilos están construyendo instancias A, este código se romperá. E incluso en un solo hilo, normalmente no desea que una sola instancia modifique el estado compartido por cada instancia. Pero si lo hiciste, esta es una forma de lograrlo.

+1

Erickson tiene razón: crea una nueva instancia y serán equivalentes. Y si cambia los valores de esas teclas y luego crea otra instancia nueva, se reemplazarán con los valores originales otra vez. – aperkins

Cuestiones relacionadas