關于初始化塊和構造方法的順序問題一直是一個比較容易混淆的問題,很多初學者都會在此犯迷糊,今天博主就來給大家普及一下這方面的知識,我們首先需要了解初始化塊和構造方法的定義,
一、初始化塊
初始化塊分為靜態初始化塊和普通初始化塊,本質上是一個代碼塊和方法體:
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
列印結果:

通過上述代碼,我們可以很輕松的得出初始化塊和構造器的執行順序,聰明的小伙伴們,相信你們應該學會了吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/16163.html
標籤:Java
