java:初始化塊和構造方法
阿新 • • 發佈:2020-09-12
關於初始化塊和構造方法的順序問題一直是一個比較容易混淆的問題,很多初學者都會在此犯迷糊,今天博主就來給大家普及一下這方面的知識。我們首先需要了解初始化塊和構造方法的定義。
一、初始化塊
初始化塊分為靜態初始化塊和普通初始化塊,本質上是一個程式碼塊和方法體:
1.靜態初始化塊
靜態初始化塊(靜態程式碼塊)的格式:static{ };
關鍵字 static:如果將域定義為 static,這個類的所有例項物件將共享這個域。因此,靜態程式碼塊是屬於類的,它不屬於任何一個物件,它的作用就是給類進行初始化,它會隨著類的載入而執行,而且只執行一次。
2.普通初始化塊
初始化塊就是構造程式碼塊,它是類中的獨立程式碼塊,可以給所有物件進行初始化,隨著建立物件時隱式呼叫。
二、構造方法(構造器)
在構造類的物件時,構造器就會執行,將例項域初始化為希望的狀態。構造器會隨著 new 操作符的執行而被呼叫,但是不能對一個已經存在的物件呼叫構造器。
構造器:
- 構造器和類同名
- 每個類可以有一個以上的構造器
- 構造器可以有0個、1個或者多個引數
- 不用定義返回值型別,也沒有具體返回值
三、執行順序
在建立物件的時候,會首先執行初始化塊,然後執行構造器的主要部分,一般建議將初始化塊定義在域的後面。
在類中是可以包含多個程式碼塊的,靜態程式碼塊的執行順序在普通程式碼塊之前,同級別的程式碼塊執行順序的話,按照定義的先後進行。
當類中包含初始化塊,構造器時,其記住執行順序:
靜態程式碼塊/靜態變數 > 普通程式碼塊/普通變數 > 構造器
說了這麼多,肯定有小夥伴感覺很迷茫,既然如此,上程式碼:
1 public class Test { 2 3 public static void main(String[] args){ 4 5 A a = new A(); 6 7 } 8 9 } 10 class A { 11 static{ 12 System.out.println("靜態程式碼塊"); 13 } 14 15 { 16 System.out.println("普通程式碼塊1"); 17} 18 { 19 System.out.println("普通程式碼塊2"); 20 } 21 public A(){ 22 System.out.println("構造器"); 23 } 24 25 }
列印結果:
接下來,我們改變程式碼塊順序,再試一次:
1 public class Test { 2 3 public static void main(String[] args){ 4 5 A a = new A(); 6 7 } 8 9 } 10 class A { 11 { 12 System.out.println("普通程式碼塊2"); 13 } 14 public A(){ 15 System.out.println("構造器"); 16 } 17 { 18 System.out.println("普通程式碼塊1"); 19 } 20 21 22 static{ 23 System.out.println("靜態程式碼塊"); 24 } 25 26 } 27
列印結果:
通過上述程式碼,我們可以很輕鬆的得出初始化塊和構造器的執行順序,聰明的小夥伴們,相信你們應該學會了吧。