Java中構造方法,構造程式碼塊和靜態程式碼塊執行順序詳解

Algomonsrico發表於2020-10-09

Java中構造方法,構造程式碼塊和靜態程式碼塊執行順序詳解

前言:

構造方法,構造程式碼塊和靜態程式碼塊的執行順序是一個常見的面試題,精通Java的人都知道執行順序為:“靜態程式碼塊——>構造方法——>構造程式碼塊”,接下來對該順序進行詳細分析

分析:

1.構造方法的執行:

​ 所有的Java類中至少都會有一個構造方法,用於物件的初始化。
在這裡每次建立新的物件時,紅箭頭所指的“ ( ) ”部分其實就是在呼叫構造方法插入圖片描述

2.構造程式碼塊的執行:

​ 構造程式碼塊是類中編寫的一個程式碼塊成員,它與構造方法不同,如下圖所示:
在這裡插入圖片描述
​ 我們定義一個物件後執行程式碼,結果如下:
在這裡插入圖片描述
​ 從上圖我們可以發現,構造程式碼塊的執行早於構造方法。

​ 實際上,構造程式碼塊和構造方法執行的時機都很類似,甚至可以說功能上是重複的,那為什麼還要使用構造程式碼塊呢?是因為構造方法一般有很多種,比如無參構造,一參構造,二參構造等等,而有些操作是不論我們使用哪種構造方法都需要使用的,那麼這時候使用構造程式碼塊來放置這些操作,便不會因為構造方法太多而多次編寫同樣的操作,節省了我們的精力。

3.靜態程式碼塊的執行:

靜態程式碼塊,構造程式碼塊和構造方法示例

​ 如上圖,靜態程式碼塊由static修飾,我們知道,在Java中,使用static修飾的成員屬性和成員方法,是獨立於具體的變數和具體的方法的,它們並不是隨著物件的建立而建立,而是在類載入時便已經初始化,換言之,可以將靜態成員、靜態方法和靜態程式碼塊看成是“屬於類的”,只要類被載入出了,它們便可以被我們訪問,也正因此,無論其他物件建立多少次,建立多少份資料,靜態成員和方法均只有一份資料。

​ 進一步使用類比理解,我們可以將類和物件分別類比為圖紙和依照圖紙製造的實物。例如:類對應寶馬汽車的圖紙,物件對應為某輛寶馬汽車,而靜態修飾的屬性可以看做是類的屬性,也就是圖紙的屬性,將之類比為記錄圖紙使用次數的電腦;非靜態修飾的屬性我們看做是物件的屬性,將之類比為寶馬的方向盤。

​ 在製造寶馬的時候,圖紙被不斷地使用,但是不論圖紙如何使用,記錄圖紙使用次數的電腦都只有一臺,而寶馬不斷製造時,每一輛寶馬都有一個方向盤,也就是說,static修飾的部分並不會隨著新物件的建立(新寶馬的製造)而建立新的資料(使用新的電腦),而非static修飾的部分會隨著新物件的建立(新寶馬的製造)而建立新的資料(新的方向盤)。

圖解:

​ 定義一個類,同時定義其靜態程式碼塊,構造程式碼塊和構造方法如圖:

在這裡插入圖片描述

​ 定義三個相應的物件,執行結果如圖:
在這裡插入圖片描述

總結:

​ 構造程式碼塊,構造方法和靜態程式碼塊的執行順序是:

​ 靜態程式碼塊——>構造程式碼塊——>構造方法

​ 並且我們可以注意到,構造程式碼塊和構造方法隨著每一次物件的建立而執行,但靜態程式碼塊只隨著類的載入而執行,由於類只載入一次,因此靜態程式碼塊也只載入一次。
構造程式碼塊和構造方法隨著每一次物件的建立而執行,但靜態程式碼塊只隨著類的載入而執行,由於類只載入一次,因此靜態程式碼塊也只載入一次。

相關文章