Java中構造方法,構造程式碼塊和靜態程式碼塊執行順序詳解
Java中構造方法,構造程式碼塊和靜態程式碼塊執行順序詳解
前言:
構造方法,構造程式碼塊和靜態程式碼塊的執行順序是一個常見的面試題,精通Java的人都知道執行順序為:“靜態程式碼塊——>構造方法——>構造程式碼塊”,接下來對該順序進行詳細分析
分析:
1.構造方法的執行:
所有的Java類中至少都會有一個構造方法,用於物件的初始化。
2.構造程式碼塊的執行:
構造程式碼塊是類中編寫的一個程式碼塊成員,它與構造方法不同,如下圖所示:
我們定義一個物件後執行程式碼,結果如下:
從上圖我們可以發現,構造程式碼塊的執行早於構造方法。
實際上,構造程式碼塊和構造方法執行的時機都很類似,甚至可以說功能上是重複的,那為什麼還要使用構造程式碼塊呢?是因為構造方法一般有很多種,比如無參構造,一參構造,二參構造等等,而有些操作是不論我們使用哪種構造方法都需要使用的,那麼這時候使用構造程式碼塊來放置這些操作,便不會因為構造方法太多而多次編寫同樣的操作,節省了我們的精力。
3.靜態程式碼塊的執行:
如上圖,靜態程式碼塊由static修飾,我們知道,在Java中,使用static修飾的成員屬性和成員方法,是獨立於具體的變數和具體的方法的,它們並不是隨著物件的建立而建立,而是在類載入時便已經初始化,換言之,可以將靜態成員、靜態方法和靜態程式碼塊看成是“屬於類的”,只要類被載入出了,它們便可以被我們訪問,也正因此,無論其他物件建立多少次,建立多少份資料,靜態成員和方法均只有一份資料。
進一步使用類比理解,我們可以將類和物件分別類比為圖紙和依照圖紙製造的實物。例如:類對應寶馬汽車的圖紙,物件對應為某輛寶馬汽車,而靜態修飾的屬性可以看做是類的屬性,也就是圖紙的屬性,將之類比為記錄圖紙使用次數的電腦;非靜態修飾的屬性我們看做是物件的屬性,將之類比為寶馬的方向盤。
在製造寶馬的時候,圖紙被不斷地使用,但是不論圖紙如何使用,記錄圖紙使用次數的電腦都只有一臺,而寶馬不斷製造時,每一輛寶馬都有一個方向盤,也就是說,static修飾的部分並不會隨著新物件的建立(新寶馬的製造)而建立新的資料(使用新的電腦),而非static修飾的部分會隨著新物件的建立(新寶馬的製造)而建立新的資料(新的方向盤)。
圖解:
定義一個類,同時定義其靜態程式碼塊,構造程式碼塊和構造方法如圖:
定義三個相應的物件,執行結果如圖:
總結:
構造程式碼塊,構造方法和靜態程式碼塊的執行順序是:
靜態程式碼塊——>構造程式碼塊——>構造方法
並且我們可以注意到,構造程式碼塊和構造方法隨著每一次物件的建立而執行,但靜態程式碼塊只隨著類的載入而執行,由於類只載入一次,因此靜態程式碼塊也只載入一次。
構造程式碼塊和構造方法隨著每一次物件的建立而執行,但靜態程式碼塊只隨著類的載入而執行,由於類只載入一次,因此靜態程式碼塊也只載入一次。
相關文章
- Java普通程式碼塊,構造程式碼塊,靜態程式碼塊區別,執行順序的程式碼例項Java
- Java中建構函式、靜態程式碼塊、程式碼塊的執行順序Java函式
- Java中靜態程式碼塊、構造程式碼塊、建構函式、普通程式碼塊Java函式
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- 構造程式碼塊
- java7-2 構造程式碼塊的概述和講解Java
- Java基礎、jvm 程式碼塊和構造方法的小問題JavaJVM構造方法
- Java靜態程式碼塊Java
- 夯實Java基礎系列7:Java 程式碼塊和執行順序Java
- 關於Static程式碼塊、匿名程式碼塊、構造器的小擴充C程式
- 靜態程式碼塊
- static變數,static程式碼塊,建構函式,程式碼塊等的載入順序變數C程式函式
- 嬰兒的出生為你解惑建構函式和構造程式碼塊函式
- Effective Java - 靜態方法與構造器Java
- 夯實Java基礎系列7:一文讀懂Java 程式碼塊和執行順序Java
- Java--構造器和構造方法Java構造方法
- java類內部程式碼執行順序Java
- 靜態程式碼塊類載入時並不會執行
- 在繼承當中這些方法及程式碼塊執行順序是什麼樣的繼承
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java中,類與類,類中的程式碼執行順序Java
- 構造和解構函式呼叫順序函式
- Java 中的程式碼塊Java
- Java中的程式碼塊Java
- Go包中程式碼執行順序Go
- java學習回顧---執行緒和同步程式碼塊Java執行緒
- JavaScript程式碼執行順序和資料型別JavaScript資料型別
- java 程式碼塊Java
- java中的程式碼塊(初始化塊)Java
- Java - 26 程式碼塊Java
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- [譯] Ruby 2.6 String的split 方法支援程式碼塊執行
- 【JavaScript】JS引擎中執行上下文如何順序執行程式碼JavaScriptJS行程
- 61行程式碼構建最簡單區塊鏈行程區塊鏈
- 程式碼塊
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- MyBatisPlus效能分析外掛,條件構造器,程式碼自動生成器詳解MyBatis
- 構造方法構造方法