Java中構造代碼塊的使用


例子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方法之后執行而已


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM