代碼塊
在java中用{}括起來的稱為代碼塊,代碼塊可分為以下四種:
- 普通代碼塊
- 構造代碼塊
- 靜態代碼塊
- 同步代碼塊
普通代碼塊
在方法或語句中出現的{}就稱為普通代碼塊。普通代碼塊和一般語句的執行順序由他們在代碼中出現的次序決定,先出現先執行。
普通代碼塊一般過來限制變量的作用域,防止代碼過多時可能產生的變量命名沖突。
示例:
public class testDemo {public static void main(String[] args ) {{int x = 3;System.out.println("普通代碼塊中的變量x=" + x);}int x = 1;System.out.println("主方法中的變量想=" + x);{int y = 7;System.out.println("普通代碼塊中的變量y=" + y);}}}
構造代碼塊
在類中直接使用沒有任何修飾符的{}聲明的代碼塊就是構造塊。
和構造函數的作用類似,都能對對象進行初始化,并且只要實例化一個對象,構造代碼塊都會執行一次。
構造塊優先于構造函數執行,如果存在多個構造代碼塊,則執行順序按照定義的順序依次執行。
示例:
public class testDemo {public static void main(String[] args ) {Test t = new Test();}
}class Test{{//構造代碼塊System.out.println("構造代碼塊1。");}//構造函數public Test(){System.out.println("無參構造函數。");}{//構造代碼塊System.out.println("構造代碼塊2。");}
}
輸出結果:
構造代碼塊1。
構造代碼塊2。
無參構造函數。
靜態代碼塊
在java中使用static關鍵字聲明的代碼塊。靜態塊用于初始化類,為類的屬性初始化。
靜態代碼塊在類被加載的時候就運行了,而且只運行一次,并且優先于各種代碼塊以及構造函數。如果一個類中有多個靜態代碼塊,會按照書寫順序依次執行。
一般情況下,如果有些代碼需要在項目啟動的時候就執行,這時候就需要靜態代碼塊。比如一個項目啟動需要加載的很多配置文件等資源,我們就可以都放入靜態代碼塊中。
示例:
public class testDemo {public static void main(String[] args ) {Test t1 = new Test();System.out.println("**********");Test t2 = new Test();}
}class Test{static {//靜態代碼塊System.out.println("靜態代碼塊1。");}//構造函數public Test(){System.out.println("無參構造函數。");}static {//靜態代碼塊System.out.println("靜態代碼塊2。");}
}輸出結果:
靜態代碼塊1。
靜態代碼塊2。
無參構造函數。
**********
無參構造函數。
同步代碼塊
使用synchronized(){}包裹起來的代碼塊,在多線程環境下,對共享數據的讀寫操作是需要互斥進行的,否則會導致數據的不一致性。同步代碼塊需要寫在方法中。
代碼塊執行順序
靜態代碼塊 > 構造代碼塊 > 構造函數
示例:
public class testDemo {public static void main(String[] args ) {Test t = new Test();}
}class Test{{//構造代碼塊System.out.println("構造代碼塊");}//構造函數public Test(){System.out.println("構造函數");}static {//靜態代碼塊System.out.println("靜態代碼塊");}}輸出結果:
靜態代碼塊
構造代碼塊
構造函數