詳解Java中的實例初始化塊(IIB)
在 Java 語言中的類初始化塊 文章中我們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我覺得介紹的有點簡單了,于是,再寫一篇文章詳細介紹下吧。
Java 語言中,存在三種操作:方法 、構造函數 和 初始化塊。
其中初始化塊又分為 實例初始化塊 ( IIB ) 和 靜態(tài)初始化塊。本章節(jié),我們主要介紹實例初始化塊。
實例初始化塊 用于初始化實例變量。
實例初始化塊 會在初始化類的一個實例時執(zhí)行,而且在構造函數之前就執(zhí)行。并且每次創(chuàng)建類的對象時它們都會執(zhí)行。
實例化塊的語法
實例初始化塊一般放在構造函數之前,使用大括號 {} 擴起來的代碼。語法結構一般如下
class JavaTester { // 實例化塊 { System.out.println("IIB block"); } // 構造函數 JavaTester() { System.out.println("Constructor Called"); } public static void main(String[] args) { JavaTester a = new JavaTester(); } }
注意,實例化塊并不是類的必須。只是一個可選項。用于抽出構造函數的公共部分單獨執(zhí)行而已。
這段代碼是可以編譯運行的,運行結果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester IIB block Constructor Called
一個類中包含多個實例初始化塊
類中的 實例初始化塊 并不是類所必須的,而且,不限數量。一個類既可以沒有實例初始化塊,也可以有多個實例初始化塊。
如果一個類有多個實例初始化塊,那么它們會按照順序從上到下依次執(zhí)行,也就是說,定義在類頂部的實例初始化塊最先執(zhí)行。
我們來看一段代碼,下面的類 JavaTester 定義了多個實例初始化塊。
class JavaTester { { System.out.println("IIB1 block 1 "); } { System.out.println("IIB2 block 2"); } JavaTester() { System.out.println("Constructor Called"); } { System.out.println("IIB3 block 3"); } public static void main(String[] args) { JavaTester a = new JavaTester(); } }
運行上面這段代碼,輸出結果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester IIB1 block 1 IIB2 block 2 IIB3 block 3 Constructor Called
父類中的初始化塊
在 Java 語言的繼承體系中,父類同樣可以有初始化塊,而且數量不限。
父類的實例初始化塊在子類的構造函數中調用 super() 之后立即運行。編譯器會在執(zhí)行當前類的實例初始化塊之前先執(zhí)行父類的實例初始化塊。
是不是很繞口,我們寫一段代碼來演示下
class B { B() { System.out.println("B-Constructor Called"); } { System.out.println("B-IIB block"); } } public class JavaTester extends B { { System.out.println("JavaTester IIB1 block 1 "); } { System.out.println("JavaTester IIB2 block 2"); } JavaTester() { super(); System.out.println("JavaTester-Constructor Called"); } { System.out.println("JavaTester IIB3 block 3"); } public static void main(String[] args) { JavaTester a = new JavaTester(); } }
運行以上范例,輸出結果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester B-IIB block B-Constructor Called JavaTester IIB1 block 1 JavaTester IIB2 block 2 JavaTester IIB3 block 3 JavaTester-Constructor Called
從運行的結果來看,當創(chuàng)建類 JavaTester 的對象時,編譯器嘗試執(zhí)行類 JavaTester 的構造函數。但因為它有一個父類,在發(fā)現了 super() 語句后,就轉而先執(zhí)行父類的構造函數。
因此,在繼承體系中,實例初始化塊和構造函數的執(zhí)行順序如下
執(zhí)行父類的實例初始化塊
執(zhí)行父類的構造函數
執(zhí)行當前類的實例初始化塊
執(zhí)行當前類的構造函數
實例初始化塊的要點
我們一起來回顧下實例初始化塊的要點。
每次創(chuàng)建新實例時都會運行實例初始化塊
初始化塊按它們在類中出現的順序運行
如果存在父類,則首先會實例化父類然后在調用當前類的實例初始化塊,最后再調用當前類的構造函數。
相關文章
slf4j與jul、log4j1、log4j2、logback的集成原理
這篇文章主要介紹了slf4j與jul、log4j1、log4j2、logback的集成原理,以及通用日志框架與具體日志實現系統(tǒng)的機制機制介紹,包括依賴的jar包,jar沖突處理等2022-03-03淺析Java常用API(Scanner,Random)匿名對象
這篇文章主要介紹了Java常用API(Scanner,Random)匿名對象,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03Java動態(tài)線程池插件dynamic-tp集成zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協(xié)調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等2023-03-03如何解決Mybatis-plus中@TableLogic注解失效問題
這篇文章主要介紹了如何解決Mybatis-plus中@TableLogic注解失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Mybatis實戰(zhàn)之TypeHandler高級進階
本文主要介紹了自定義的枚舉TypeHandler的相關知識,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02