Это (нестатический) блок инициализатора. Он описан в официальном учебнике 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
Спасибо обоим U ... Это было очень полезно ... Был невежественный раньше ... – Kasturi 2010-11-22 20:35:49