標籤:對象 一致性 多線程 存在 訪問 建構函式 通過 string 棧記憶體
一.簡介
1.普通代碼塊:
類中方法的方法體
2.構造代碼塊:
構造塊會在建立對象時被調用,每次建立時都會被調用,優先於類建構函式執行。
3.靜態代碼塊:
用static{}包裹起來的程式碼片段,只會執行一次。靜態代碼塊優先於構造塊執行。
4.同步代碼塊:
使用synchronized(){}包裹起來的代碼塊,在多線程環境下,對共用資料的讀寫操作是需要互斥進行的,否則會導致資料的不一致性。同步代碼塊需要寫在方法中。
二.靜態代碼塊和構造代碼塊的異同點
相同點:都是JVM載入類後且在建構函式執行之前執行,在類中可定義多個,一般在代碼塊中對一些static變數進行賦值。
不同點:靜態代碼塊在非靜態代碼塊之前執行。靜態代碼塊只在第一次new時執行一次,之後不在執行。而非靜態代碼塊每new一次就執行一次。
三.示範1.普通代碼塊
普通代碼塊的存在可以將類的生命週期內只調用一次的代碼放在一起,程式調用完之後就立即銷毀,這樣可以節省棧記憶體,防止棧溢出。
普通代碼塊執行的順序是按照排列的先後順序。
public class Test1 { public static void main(String[] args) { { int x = 3; System.out.println("普通代碼塊內的變數x=" + x); } int x = 1; System.out.println("主方法內的變數x=" + x); { int y = 7; System.out.println("普通代碼塊內的變數y=" + y); } } }
運行結果:
普通代碼塊內的變數x=3主方法內的變數x=1普通代碼塊內的變數y=7
2.構造代碼塊
直接在類中定義且沒有加static關鍵字的代碼塊稱為{}構造代碼塊。
public class Test1 { { System.out.println("構造代碼塊先執行~~~"); } public Test1() { System.out.println("建構函式再執行~~~~"); } public static void main(String[] args) { Test1 t = new Test1(); System.out.println("普通代碼塊最後執行~~~"); } }
運行結果:
構造代碼塊先執行~~~建構函式再執行~~~~普通代碼塊最後執行~~~
3.靜態代碼塊
在java中使用static關鍵字聲明的代碼塊。靜態塊用於初始化類,為類的屬性初始化。每個靜態代碼塊只會執行一次。
由於JVM在載入類時會執行靜態代碼塊,所以靜態代碼塊先於主方法執行。
public class Test1 { static String s1 = "cjj"; //靜態變數 String s2 = "吹靜靜"; //普通變數 static{//靜態變數 System.out.println("靜態代碼塊最先執行~~~" + s1); } {//非靜態代碼塊 System.out.println("構造代碼塊再執行~~~" + s2); } public Test1() {//建構函式 System.out.println("建構函式再執行~~~~"); } public static void main(String[] args) { Test1 t = new Test1(); System.out.println("普通代碼塊最後執行~~~"); } }
運行結果:
靜態代碼塊最先執行~~~cjj構造代碼塊再執行~~~吹靜靜建構函式再執行~~~~普通代碼塊最後執行~~~
注意:
1.靜態代碼塊不能存在於任何方法體內。
2.靜態代碼塊不能直接存取執行個體變數和執行個體方法,需要通過類的執行個體對象來訪問
Java 代碼塊