1. 程式人生 > >Java中的程式碼塊(靜態程式碼塊、構造程式碼塊、同步程式碼塊)

Java中的程式碼塊(靜態程式碼塊、構造程式碼塊、同步程式碼塊)

Java中{}內的東西統稱為程式碼塊分為靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊
所有{}內定義的變數,其作用域僅限於該{},離開{}後其內部的變數棧空間和堆空間都被JVM(Java Virtual Machine)所回收而不能再使用。在{}中不能定以兩個同名變數,不能定義兩個相同的方法(方法名、方法引數型別和個數均一一對應的方法)。

  • 靜態程式碼塊
	public class <類名稱> {
		static {
			<靜態程式碼塊中的語句>;
		}
	}

當類中有一個靜態程式碼塊時,靜態程式碼塊只執行一次,當有多個靜態程式碼塊時,按照總體先後順序來執行靜態程式碼塊。
靜態程式碼塊針對類而言。當位元組碼檔案進方法區時(也就是用new來呼叫構造方法產生例項時),就執行靜態程式碼塊。每個類的構造方法中預設第一條是父類的構造方法,也就是super();(這裡根據使用者書寫的super();為主,當未寫super();時,預設執行父類無參構造方法,且當父類沒有無參構造時,編譯器報錯)。

  • 構造程式碼塊
	public class <類名稱> {
		public <類名稱>() {
		}
		{
			<構造程式碼塊中的語句>;
		}
	}

構造程式碼塊和構造方法同級,在該類建立物件時呼叫,而且先於構造方法執行。當有多個構造程式碼塊時,按照總體順序一次執行。

  • 區域性程式碼塊
    區域性程式碼塊針對方法而言,在方法內的程式碼塊。
	public class <類名稱> {
		public <方法返回值型別> <方法名> (<方法引數型別> <引數名稱>) {
			{
				<區域性程式碼塊中的語句>;
			}
		}
	}

區域性程式碼塊處於某個方法中,離開作用域不能使用。當有多個區域性代塊時,按照總體順序一一執行。

  • 同步程式碼塊
    unknown
    使用synchronized(){}包裹起來的程式碼塊,在多執行緒環境下,對共享資料的讀寫操作是需要互斥進行的,否則會導致資料的不一致性。同步程式碼塊需要寫在方法中。
    程式程式碼塊執行的一般過程
    首先遇到new關鍵字用構造方法產生物件時,按順序執行該類的父類中的所有靜態程式碼塊,然後執行子類的所有靜態程式碼塊,執行父類的構造程式碼塊,在執行父類的構造方法,再執行子類的構造程式碼塊,再執行子類構造方法,再執行下面的語句。(這裡的先執行父類的方法是因為父、子類由於繼承關係子類使用前要用父類資料)。