java提高篇-----代碼塊

來源:互聯網
上載者:User

標籤:可讀性   好的   toolbar   程式碼片段   void   需要   處理   修飾符   進入   

 自己添加部分  構造代碼塊在變數初始化之後執行;也符合java編程思想中  ---- 靜態構造代碼塊>變數初始化> 普通構造代碼塊 

      在編程過程中我們可能會遇到如下這種形式的程式:

public class Test {    {        ////    }}

      這種形式的程式段我們將其稱之為代碼塊,所謂代碼塊就是用大括弧({})將多行代碼封裝在一起,形成一個獨立的資料體,用於實現特定的演算法。一般來說代碼塊是不能單獨啟動並執行,它必須要有運行主體。在Java中代碼塊主要分為四種:

一、 普通代碼塊

      普通代碼塊是我們用得最多的也是最普遍的,它就是在方法名後面用{}括起來的程式碼片段。普通代碼塊是不能夠單獨存在的,它必須要緊跟在方法名後面。同時也必須要使用方法名調用它。

public class Test {    public void test(){        System.out.println("普通代碼塊");    }}
二、 靜態代碼塊

      想到靜態我們就會想到static,靜態代碼塊就是用static修飾的用{}括起來的程式碼片段,它的主要目的就是對靜態屬性進行初始化。

public class Test {    static{        System.out.println("靜態代碼塊");    }}
三、 同步代碼塊

      使用 synchronized 關鍵字修飾,並使用“{}”括起來的程式碼片段,它表示同一時間只能有一個線程進入到該方法塊中,是一種多線程保護機制。

四、 構造代碼塊

      在類中直接定義沒有任何修飾符、首碼、尾碼的代碼塊即為構造代碼塊。我們明白一個類必須至少有一個建構函式,建構函式在產生對象時被調用。構造代碼塊和建構函式一樣同樣是在產生一個對象時被調用,那麼構造代碼在什麼時候被調用?如何調用的呢?看如下代碼:

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:執行構造代碼塊...執行無參建構函式...----------------執行構造代碼塊...執行有參建構函式...

      從上面的運行結果可以看出在new一個對象的時候總是先執行構造代碼,再執行建構函式,但是有一點需要注意構造代碼不是在建構函式之前啟動並執行,它是依託建構函式執行的。正是由於構造代碼塊有這幾個特性,所以它常用於如下情境:

      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:執行靜態代碼塊...----------------------執行構造代碼塊...執行無參建構函式...----------------------執行構造代碼塊...執行有參建構函式...

六、變數(欄位)初始化 靜態代碼塊、構造代碼塊、建構函式執行順序

class Soap {
private String s;

Soap() {
System.out.println("Soap()");
s = new String("Constructed");
}

public String toString() {
return s;
}
}

public class Test {

private Soap soap=new Soap();
/**
* 靜態代碼塊
*/
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:

執行靜態代碼塊...
----------------------
Soap()
執行構造代碼塊...
執行無參建構函式...
----------------------
Soap()
執行構造代碼塊...
執行有參建構函式...

java提高篇-----代碼塊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.