2009-10-15 2 views
8

Первоначально я думал, что статические блоки были для статических переменных, но компилятор позволяет компиляции и запускам как A, так и B, что дает?
О статических и нестатических блоках инициализации в Java

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

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

Б

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

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

System.out.println(Main.m.toString()); Запуск для A отпечатки

{}

но работает то же самое для B печатает в Йоду-говорить

{это = работа, почему = делает}

+0

Есть ли альтернатива статических и нестатических блоков? –

ответ

13

Нестатический блок выполняется, когда создается «экземпляр» класса.

Таким образом

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

печатает ничего, потому что вы не создали экземпляр.

Попробуйте создать экземпляр первого

Main main = new Main(); 

и вы увидите то же сообщение, как B

Как вы знаете, переменные класса (объявленные с помощью статического) находятся в области видимости при использовании экземпляра блоков.

Смотрите также:

Anonymous Code Blocks In Java

+0

Что делает идеальный логический смысл –

6

В A, у вас есть экземпляр инициализатор. Он будет выполняться каждый раз, когда вы создадите новый экземпляр A.

Если несколько потоков строят A экземпляров, этот код сломается. И даже в одном потоке вы обычно не хотите, чтобы один экземпляр изменял состояние, которое делится каждым экземпляром. Но если вы это сделали, это один из способов его достижения.

+1

Эриксон прав - создайте новый экземпляр, и они будут эквивалентны. И если вы измените значения для этих ключей, а затем создайте еще один новый экземпляр, они снова будут заменены исходными значениями. – aperkins

Смежные вопросы