1. 程式人生 > >Java之路:程式碼塊

Java之路:程式碼塊

程式碼塊

程式碼塊是一種常見的程式碼形式。它用大括號“{ }”將多行程式碼封裝在一起,形成一個獨立的程式碼區域,這就構成了程式碼塊。程式碼塊的格式如下:

{
  	//程式碼塊
}

程式碼塊有四種:
(1)普通程式碼塊。
(2)構造程式碼塊。
(3)靜態程式碼塊。
(4)同步程式碼塊。

程式碼塊不能夠獨立執行,須要依賴於其他配置。

1、普通程式碼塊

在方法名後(或方法體內)用一對“{ }”括起來的資料塊就是普通程式碼塊。它不能夠單獨存在於類中,需要緊跟在方法名後面,並通過方法呼叫。

public class NormalCodeBlock {
	public static
void main(String[]args) { //“{}”括起來的部分就是普通的程式碼塊 { int x=10; System.out.println("普通程式碼塊內,x="+x); } int x=100; System.out.println("x="+x); } }

【結果】
在這裡插入圖片描述
在普通程式碼塊內,變數的作用範圍自左花括號“{”內定義處開始,到右花括號“}”結束。

2、構造程式碼塊

構造程式碼塊就是在類中直接定義的,且沒有任何字首、字尾以及修飾符的程式碼塊。

在一個類中,至少需要有一個構造方法(如果使用者自己不顯式定義,編譯器會“隱式”地配備一個),它在生成物件時被呼叫。

構造程式碼塊和構造方法一樣是在物件生成時被呼叫,但是它的呼叫時機比構造方法還要早。 由於這種特性,構造程式碼塊可用來初始化成員變數。

如果一個類中有多個構造方法,這些構造方法都需要初始化成員變數,那麼就可以把每個構造方法中相同的程式碼部分抽取出來,集中一起放在構造程式碼塊中。

這樣利用構造程式碼塊來初始化共有的成員變數,可大大減少不同構造方法中重複的程式碼,提高程式碼的複用性。

public class Test3 {
	public static void main(String[]args) {
		Person p1=new Person();
	    System.
out.println("---------------------"); Person p2=new Person("Zhang"); } } class Person { //構造程式碼塊 { System.out.println("構造程式碼塊執行……"); x=100; } //構造方法的程式碼塊 Person() { System.out.println("構造方法執行……"); name="Guangzi"; show(); } //構造方法的程式碼塊 Person(String name) { System.out.println("構造方法執行……"); this.name=name; show(); } void show() { System.out.println("Welcome!"+name); System.out.println("x="+x); } private String name; private int x; }

【結果】
在這裡插入圖片描述
【結果分析】
在Person類中,對類的資料成員x進行初始化。如果語句“x = 100;”不放置於程式碼塊中,要達到相同的效果,此句語句就需要分別出現在構造方法Person()和Person(String name)中。如果使用預設值來初始化類中的成員變數比較多,很明顯,使用構造程式碼塊能節省很多程式碼空間。

【注意事項】

(1)構造程式碼塊中的初始化是一個類的所有構造方法都共有的“交集”部分,具有個性化特徵的初始化還是要放在各自的構造方法中。

(2)構造程式碼塊不在任何方法之內,僅位於類的範圍內,它的地位和其他方法體是對等的。

(3)可以理解為構造程式碼塊是沒有名稱的方法體,但僅限用於對類資料成員的初始化,且僅執行一次。

(4)在類被例項化的過程中,構造程式碼塊內的程式碼比構造方法先執行。

(5)構造程式碼塊*不僅可以減少程式碼量,也提高了程式碼的可讀性,善用構造程式碼塊能夠給編碼帶來許多便利。

3、靜態程式碼塊

使用static關鍵字加以修飾並用大括號“{ }”括起來的程式碼塊稱為靜態程式碼塊,其主要用來初始化靜態成員變數。它是最早執行的程式碼塊。

public class StaticCodeBlock {
	//靜態程式碼塊
	static
	{
		System.out.println("靜態程式碼塊執行……");
	}
	//構造方法
	public StaticCodeBlock() {
		System.out.println("構造方法執行……");
	}
	//構造程式碼塊
	{
		System.out.println("構造程式碼塊執行……");
	}

	public static void main(String[] args) {
	    System.out.println("main方法開始執行……");
	    System.out.println("建立第1個物件……");
	    new StaticCodeBlock();
	    System.out.println("建立第2個物件……");
	    new StaticCodeBlock();
	    System.out.println("建立第3個物件……");
	    new StaticCodeBlock();
	}
}

【結果】
在這裡插入圖片描述
【結果分析】

從結果可以看出,靜態程式碼塊的執行時間比主方法main()方法都要早,靜態塊還優先於構造方法的執行

【注意事項】

(1)在執行時機上,靜態程式碼塊在類載入時就會執行,因此早於構造程式碼塊、構造方法。
(2)當靜態程式碼塊和main方法屬於同一個類時,靜態程式碼塊比main方法執行早。靜態塊的執行級別是最高的。
(3)不管有多少個例項化物件產生,靜態塊都只執行一次。
(4)利用這種特性,靜態程式碼塊可以被用來初始化類中的靜態成員變數。 靜態成員變數是屬於所有類物件共享的,故此不會受到建立物件個數的影響。