1. 普通代碼塊:方法中的代碼塊, 不能單獨執行, 必須調用方法才能執行
2. 構造代碼塊:在類中, 沒有任何前綴和後綴, 使用"{}"包起來的代碼塊
3. 靜態代碼塊:在類型,使用static修飾,並使用"{}"包起來的代碼塊
4. 同步代碼塊:使用synchronized修飾,並使用"{}"包起來的代碼塊
public class UserTest {
private int id;
private String name;
public static AtomicInteger count = new AtomicInteger(0);//統計實例化數量
{
count.getAndIncrement();
System.out.println("構造代碼塊 count =" + count);
}
static {
String str = "靜態代碼塊執行...";
System.out.println(str);
}
public UserTest() {
this(count.get() + 1, "name"+(count.get() + 1));
System.out.println("UserTest()....");
}
public UserTest(int id) {
this.id = id;
System.out.println(String.format("UserTest(%s)....", id));
}
public UserTest(int id, Stringname) {
this.id = id;
this.name = name;
System.out.println(String.format("UserTest(%s,%s)....", id, name));
}
public static void main(String[] args) {
new UserTest(1);
new UserTest(2);
new UserTest(3, "name3");
new UserTest();
}
}
運行結果:
靜態代碼塊執行...
構造代碼塊 count = 1
UserTest(1)....
構造代碼塊 count = 2
UserTest(2)....
構造代碼塊 count = 3
UserTest(3, name3)....
構造代碼塊 count = 4
UserTest(4, name4)....
UserTest()....
運行過程分析:
1. 在實例化一個對象之前, 先執行靜態代碼塊, 而且只執行一次, 可以用來實例化全局變量, 用來做單例模式等等
2. 每次實例化一個對象之前, 都要先執行構造代碼塊, 所以可以把構造函數中通用的代碼提取出來, 可以用來統計實例化次數等等
3. 如果構造函數調用了this()方法, 那麼該構造函數不執行構造代碼塊, 被調用的構造方法中會執行構造代碼塊