構造代碼塊:
直接在類中定義且沒有加static關鍵字的代碼塊稱為{}構造代碼;
作用:給對象統一初始化數據
public class Demo1 { public static void main(String[] args) { Test test = new Test(3); //構造代碼塊會在構造函數被調用時執行, 且在這個例子中比"this.id=id;"語句先執行,作用是給對象統一初始化數據; System.out.println(test); } } class Test{ int id; String name; { this.id= 5; this.name = "測試"; System.out.println("這是構造代碼塊"); } Test(int id){ this.id = id; } public String toString(){ return "name: "+this.name +" , "+"id: "+ this.id ; } }
以下例子統計了所有構造函數一共被調用了多少次(構造代碼塊的使用)
1 public class Demo1 { 2 public static void main(String[] args) { 3 4 new Test(); 5 new Test(); 6 new Test(3); 7 new Test(); 8 new Test(5); 9 Test.count(); 10 11 } 12 } 13 14 class Test{ 15 int id; 16 String name; 17 static int sum = 0; 18 { 19 sum += 1; 20 } 21 22 Test(){ 23 24 } 25 26 Test(int id){ 27 28 } 29 30 static void count(){ 31 System.out.println(sum); 32 } 33 34 }
構造代碼塊注意點:
1:java編譯器編譯java類時,會先將成員屬性的聲明放到類的前端
2:成員變量的初始化工作放到構造函數中
3:如果類中有構造代碼塊,java編譯器在編譯時會先將構造代碼塊中的代碼移到構造函數中執行,
構造函數中原有的代碼最后執行
4:成員屬性的初始化和構造代碼塊的執行順序是根據原碼中的位置執行
局部代碼塊:
在函數中的代碼塊、
作用:在方法中,如果要縮短變量的壽命,可以使用
方法中,某段代碼之后,都不再使用某個變量(這個變量有可能是一個很大的Map集合,很占內存),則可以將其定義到局部代碼塊中,及時結束其生命周期,釋放空間!
public class Demo1 { public static void main(String[] args) { Test test = new Test(); test.run(); } } class Test{ int id; String name; void run(){ { for(int i = 0;i < 3; i++){ System.out.println(i); } System.out.println("我是局部代碼塊,變量i出了局部代碼塊就沒有任何作用"); } System.out.println("我是普通函數"); } }
靜態代碼塊:
在java中使用static關鍵字聲明的代碼塊。靜態塊用於初始化類,為類的屬性初始化。每個靜態代碼塊只會執行一次。
由於JVM在加載類時會執行靜態代碼塊,所以靜態代碼塊先於主方法執行。
注意:1 靜態代碼塊不能存在於任何方法體內。2 靜態代碼塊不能直接訪問靜態實例變量和實例方法,需要通過類的實例對象來訪問。
public class Demo1 { public static void main(String[] args) { new Test(); } } class Test{ int id; String name; static{ System.out.println("我是靜態代碼塊"); } }