2010-11-22 2 views
18

Я давно работаю с Java, но никогда не сталкивался с чем-то подобным. Я хотел бы знать, что он делает и почему это не ошибка.Java-независимый блок кода

public class Foo{ 

private int someVariable; 

{ 
    doSomething(); 
} 

public Foo(){ 
} 

private void doSomething(){ 
    // Something is done here 
} 

} 

Я хотел бы знать, что цель отдельного блока, который содержит призыв к «йоЗотеЬЫпд()». Его просто скелетный код. Фактический код, который я натолкнулся, находится на http://www.peterfranza.com/2010/07/15/gwt-scrollpanel-for-touch-screens/

+0

Спасибо обоим U ... Это было очень полезно ... Был невежественный раньше ... – Kasturi 2010-11-22 20:35:49

ответ

28

Это (нестатический) блок инициализатора. Он описан в официальном учебнике here:

Initializing Instance Пользователи

Обычно, вы должны поместить код для инициализации переменной экземпляра в конструкторе. Существует две альтернативы использованию конструктора для инициализации переменных экземпляра: блоки инициализации и конечные методы. Initializer блоки для переменного экземпляра выглядят как статические блоки инициализатора, но без статического ключевого слова:

{ 
    // whatever code is needed for initialization goes here 
} 

копий компилятора инициализатора блоков Java в конструктор. Поэтому этот подход может использоваться для совместного использования блока кода между несколькими конструкторами.


Вот простая демонстрация:

public class Test { 

    { 
     System.out.println("Initializer block"); 
    } 

    Test() { 
     System.out.println("Constructor 1"); 
    } 

    Test(int i) { 
     System.out.println("Constructor 2"); 
    } 

    public static void main(String[] args) { 
     new Test(); 
     System.out.println("---"); 
     new Test(1); 
    } 
} 

Выход:

Initializer block 
Constructor 1 
--- 
Initializer block 
Constructor 2 

Вы можете найти это полезно, когда, например, добавив JLabel на панели:

panel.add(new JLabel() {{ setBackground(Color.GREEN); setText("Hello"); }}); 

Под капотом:

Байткод блока инициализатора буквально копируется в каждый конструктор. (По крайней мере, Солнца JAVAC и затмение компилятор:

Test(); 
    Code: 
    0: aload_0 
    1: invokespecial 
    4: getstatiC#2; 
    7: ldC#3;   //String "Initializer block" 
    9: invokevirtual #4; //Method PrintStream.println:(String;)V 
    12: getstatiC#2; 
    15: ldC#5; 
    17: invokevirtual #4; 
    20: return 

Test(int); 
    Code: 
    0: aload_0 
    1: invokespecial #1; 
    4: getstatiC#2; 
    7: ldC#3;   //String "Initializer block" 
    9: invokevirtual #4; //Method PrintStream.println:(String;)V 
    12: getstatiC#2; 
    15: ldC#6; 
    17: invokevirtual #4; 
    20: return 
+3

Обратите внимание, что он работает * до * код конструктора, так не зависят от вещей, выполняемых в конструкторе (конструкторах). – 2010-11-22 20:26:01

7

Это блок инициализатора, который копируется во все конструкторы для класса.

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