Java中的程式碼塊(靜態程式碼塊、構造程式碼塊、同步程式碼塊)
阿新 • • 發佈:2018-11-16
Java中{}內的東西統稱為程式碼塊分為靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊
所有{}內定義的變數,其作用域僅限於該{},離開{}後其內部的變數棧空間和堆空間都被JVM(Java Virtual Machine)所回收而不能再使用。在{}中不能定以兩個同名變數,不能定義兩個相同的方法(方法名、方法引數型別和個數均一一對應的方法)。
- 靜態程式碼塊
public class <類名稱> {
static {
<靜態程式碼塊中的語句>;
}
}
當類中有一個靜態程式碼塊時,靜態程式碼塊只執行一次,當有多個靜態程式碼塊時,按照總體先後順序來執行靜態程式碼塊。
靜態程式碼塊針對類而言。當位元組碼檔案進方法區時(也就是用new來呼叫構造方法產生例項時),就執行靜態程式碼塊。每個類的構造方法中預設第一條是父類的構造方法,也就是super();(這裡根據使用者書寫的super();為主,當未寫super();時,預設執行父類無參構造方法,且當父類沒有無參構造時,編譯器報錯)。
- 構造程式碼塊
public class <類名稱> {
public <類名稱>() {
}
{
<構造程式碼塊中的語句>;
}
}
構造程式碼塊和構造方法同級,在該類建立物件時呼叫,而且先於構造方法執行。當有多個構造程式碼塊時,按照總體順序一次執行。
- 區域性程式碼塊
區域性程式碼塊針對方法而言,在方法內的程式碼塊。
public class <類名稱> { public <方法返回值型別> <方法名> (<方法引數型別> <引數名稱>) { { <區域性程式碼塊中的語句>; } } }
區域性程式碼塊處於某個方法中,離開作用域不能使用。當有多個區域性代塊時,按照總體順序一一執行。
- 同步程式碼塊
unknown
使用synchronized(){}包裹起來的程式碼塊,在多執行緒環境下,對共享資料的讀寫操作是需要互斥進行的,否則會導致資料的不一致性。同步程式碼塊需要寫在方法中。
程式程式碼塊執行的一般過程
首先遇到new關鍵字用構造方法產生物件時,按順序執行該類的父類中的所有靜態程式碼塊,然後執行子類的所有靜態程式碼塊,執行父類的構造程式碼塊,在執行父類的構造方法,再執行子類的構造程式碼塊,再執行子類構造方法,再執行下面的語句。(這裡的先執行父類的方法是因為父、子類由於繼承關係子類使用前要用父類資料)。