例子1
public class Client {
{
System.out.println("執行構造代碼塊1");
}
{
System.out.println("執行構造代碼塊2");
}
public Client(){
System.out.println("執行無參構造");
}
public Client(int i){
System.out.println("執行有參構造1");
}
public static void main(String[] args) {
new Client();
new Client(5);
}
}
執行構造代碼塊1
執行構造代碼塊2
執行無參構造
執行構造代碼塊1
執行構造代碼塊2
執行有參構造1
結論:在通過new關鍵字生成一個實例時會先執行構造代碼塊(相當於把構造塊的代碼插入到構造函數的最前端),然后再執行其他代碼,也就是說:構造代碼塊會在每個構造函數內首先執行(需要注意的是:構造代碼塊不是在構造函數之前運行的,它依托於構造函數的執行),同時構造代碼塊的執行順序為語句編寫順序。
例子2
public class Client {
{
System.out.println("執行構造代碼塊1");
}
{
System.out.println("執行構造代碼塊2");
}
public Client(){
System.out.println("執行無參構造");
}
public Client(int i){
System.out.println("執行有參構造1");
}
public Client(String str){
this();
System.out.println("執行有參構造2");
}
public static void main(String[] args) {
new Client();
new Client(5);
new Client("hello");
}
}
執行無參構造
執行構造代碼塊1
執行構造代碼塊2
執行有參構造1
執行構造代碼塊1
執行構造代碼塊2
執行無參構造
執行有參構造2
結論:特殊情況-如果遇到this關鍵字(也就是構造函數調用自身其他的構造函數時)則不插入構造代碼塊,對於我們的例子來說,編譯器在編譯時發現String形參的構造函數調用了無參構造,於是放棄插入構造代碼塊,所以只執行了一次構造代碼塊.。
延伸:在構造代碼塊的處理上,super方法沒有任何特殊的地方,編譯器只是把構造代碼塊插入到super方法之后執行而已