這是一個(非靜態)初始化塊。據記載在官方教程here:
初始化實例成員
通常情況下,你乾脆把代碼在構造函數初始化實例變量。使用構造函數初始化實例變量有兩種選擇:初始化塊和最終方法。 初始化語句塊實例變量看起來就像靜態初始化塊,但沒有static關鍵字:
{
// 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和Eclipse編譯:
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