首頁  >  文章  >  Java  >  java提高篇(十一)-----程式碼區塊

java提高篇(十一)-----程式碼區塊

黄舟
黄舟原創
2017-02-10 11:20:121091瀏覽

       在程式設計過程中我們可能會遇到以下這種形式的程式:

public class Test {
    {
        ////
    }
}


就是用大括號({})將多行程式碼封裝在一起,形成一個獨立的資料體,用來實作特定的演算法。一般來說程式碼區塊是不能單獨運作的,它必須要有運行主體。在Java中代碼區塊主要分為四種:

       一、 普通代碼塊

      

      起來的程式碼段。普通程式碼區塊是不能夠單獨存在的,它必須緊跟在方法名稱後面。同時也必須要使用方法名來呼叫它。

public class Test {
    public void test(){
        System.out.println("普通代码块");
    }
}


       二、靜態碼區塊

}括起來的程式碼段,它的主要目的就是對靜態屬性進行初始化。

public class Test {
    static{
        System.out.println("静态代码块");
    }
}

       三、 同步程式碼區塊

}.的程式碼片段,它表示同一時間只能有一個線程進入到該方法區塊中,是一種多執行緒保護機制。


       四、 建構程式碼區塊

       在類別中直接定義沒有任何修飾符、前綴、後綴程式碼的程式碼即為構造區塊。我們明白一個類別必須至少有一個建構函數,建構函數在生成物件時被呼叫。構造程式碼區塊和建構函式一樣同樣是在產生一個物件時被調用,那麼構造程式碼在什麼時候被調用?如何調用的呢?看以下程式碼:

public class Test {
    /**
     * 构造代码
     */
    {
        System.out.println("执行构造代码块...");
    }
    
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id  id
     */
    public Test(String id){
        System.out.println("执行有参构造函数...");
    }
}

      

上面構造了一個非常簡單的類,該類包含無參配符、有參上面構造,上面構造了一個非常簡單的類,該類包含無參碼程式碼區塊是沒有獨立運作的能力,他必須要有一個可以承載的載體,那麼編譯器會如何來處理構造程式碼區塊呢?編譯器會將程式碼區塊依照他們的順序(假如有多個程式碼區塊)插入到所有的建構函式的最前端,這樣就能保證不管呼叫哪個建構函式都會執行所有的建構程式碼區塊。上面程式碼等同於以下形式:


public class Test {
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行构造代码块...");
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id  id
     */
    public Test(String id){
        System.out.println("执行构造代码块...");
        System.out.println("执行有参构造函数...");
    }

}

       运行结果

public static void main(String[] args) {
        new Test();
        System.out.println("----------------");
        new Test("1");
    }
------------
Output:
执行构造代码块...
执行无参构造函数...
----------------
执行构造代码块...
执行有参构造函数...

      

從上面的運行結果可以在其中執行一個程式碼需要注意構造程式碼不是在建構函式之前運行的,它是依托建構函式執行的。正是因為建構程式碼塊有這幾個特性,所以它常用於以下場景:


      

1、初始化實例變數

函數都需要對實例變數進行初始化,如果我們直接在建構函式中實例化,必定會產生很多重複程式碼,繁瑣和可讀性差。這裡我們可以充分利用構造程式碼區塊來實現。這是利用編譯器會將構造程式碼區塊加入到每個建構函式中的特性。

      2、初始化實例環境

       一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。

       上面两个常用场景都充分利用构造代码块的特性,能够很好的解决在实例化对象时构造函数比较难解决的问题,利用构造代码不仅可以减少代码量,同时也是程序的可读性增强了。特别是当一个对象的创建过程比较复杂,需要实现一些复杂逻辑,这个时候如果在构造函数中实现逻辑,这是不推荐的,因为我们提倡构造函数要尽可能的简单易懂,所以我们可以使用构造代码封装这些逻辑实现部分。

       五、 静态代码块、构造代码块、构造函数执行顺序

       从词面上我们就可以看出他们的区别。静态代码块,静态,其作用级别为类,构造代码块、构造函数,构造,其作用级别为对象。

       1、 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。

       2、 构造代码块,每创建一个对象时就会执行一次,且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。

       3、 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。

       通过上面的分析,他们三者的执行顺序应该为:静态代码块 > 构造代码块 > 构造函数。


public class Test {
    /**
     * 静态代码块
     */
    static{
        System.out.println("执行静态代码块...");
    }
    
    /**
     * 构造代码块
     */
    {
        System.out.println("执行构造代码块...");
    }
    
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id
     */
    public Test(String id){
        System.out.println("执行有参构造函数...");
    }
    
    public static void main(String[] args) {
        System.out.println("----------------------");
        new Test();
        System.out.println("----------------------");
        new Test("1");
    }
}
-----------
Output:
执行静态代码块...
----------------------
执行构造代码块...
执行无参构造函数...
----------------------
执行构造代码块...
执行有参构造函数...


以上就是java提高篇(十一)-----代码块的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn