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)利用這種特性,靜態程式碼塊可以被用來初始化類中的靜態成員變數。 靜態成員變數是屬於所有類物件共享的,故此不會受到建立物件個數的影響。