詳解Java中的實例初始化塊(IIB)
在 Java 語言中的類初始化塊 文章中我們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我覺得介紹的有點簡單了,于是,再寫一篇文章詳細介紹下吧。
Java 語言中,存在三種操作:方法 、構(gòu)造函數(shù) 和 初始化塊。
其中初始化塊又分為 實例初始化塊 ( IIB ) 和 靜態(tài)初始化塊。本章節(jié),我們主要介紹實例初始化塊。
實例初始化塊 用于初始化實例變量。
實例初始化塊 會在初始化類的一個實例時執(zhí)行,而且在構(gòu)造函數(shù)之前就執(zhí)行。并且每次創(chuàng)建類的對象時它們都會執(zhí)行。
實例化塊的語法
實例初始化塊一般放在構(gòu)造函數(shù)之前,使用大括號 {} 擴起來的代碼。語法結(jié)構(gòu)一般如下
class JavaTester
{
// 實例化塊
{
System.out.println("IIB block");
}
// 構(gòu)造函數(shù)
JavaTester()
{
System.out.println("Constructor Called");
}
public static void main(String[] args)
{
JavaTester a = new JavaTester();
}
}
注意,實例化塊并不是類的必須。只是一個可選項。用于抽出構(gòu)造函數(shù)的公共部分單獨執(zhí)行而已。
這段代碼是可以編譯運行的,運行結(jié)果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester IIB block Constructor Called
一個類中包含多個實例初始化塊
類中的 實例初始化塊 并不是類所必須的,而且,不限數(shù)量。一個類既可以沒有實例初始化塊,也可以有多個實例初始化塊。
如果一個類有多個實例初始化塊,那么它們會按照順序從上到下依次執(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();
}
}
運行上面這段代碼,輸出結(jié)果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester IIB1 block 1 IIB2 block 2 IIB3 block 3 Constructor Called
父類中的初始化塊
在 Java 語言的繼承體系中,父類同樣可以有初始化塊,而且數(shù)量不限。
父類的實例初始化塊在子類的構(gòu)造函數(shù)中調(diào)用 super() 之后立即運行。編譯器會在執(zhí)行當(dāng)前類的實例初始化塊之前先執(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();
}
}
運行以上范例,輸出結(jié)果如下
[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
從運行的結(jié)果來看,當(dāng)創(chuàng)建類 JavaTester 的對象時,編譯器嘗試執(zhí)行類 JavaTester 的構(gòu)造函數(shù)。但因為它有一個父類,在發(fā)現(xiàn)了 super() 語句后,就轉(zhuǎn)而先執(zhí)行父類的構(gòu)造函數(shù)。
因此,在繼承體系中,實例初始化塊和構(gòu)造函數(shù)的執(zhí)行順序如下
執(zhí)行父類的實例初始化塊
執(zhí)行父類的構(gòu)造函數(shù)
執(zhí)行當(dāng)前類的實例初始化塊
執(zhí)行當(dāng)前類的構(gòu)造函數(shù)
實例初始化塊的要點
我們一起來回顧下實例初始化塊的要點。
每次創(chuàng)建新實例時都會運行實例初始化塊
初始化塊按它們在類中出現(xiàn)的順序運行
如果存在父類,則首先會實例化父類然后在調(diào)用當(dāng)前類的實例初始化塊,最后再調(diào)用當(dāng)前類的構(gòu)造函數(shù)。
相關(guān)文章
Spring Boot2.0 @ConfigurationProperties使用詳解
這篇文章主要介紹了Spring Boot2.0 @ConfigurationProperties使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
Java在高并發(fā)場景下實現(xiàn)點贊計數(shù)器
點贊計數(shù)器的本質(zhì)就是對某個變量在高并發(fā)情況下的修改,這篇文章主要為大家介紹了Java實現(xiàn)點贊計數(shù)器的示例代碼,感興趣的小伙伴可以了解一下2023-06-06
java 反射getClass .class 的使用方法示例
這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實例形式分析了java類反射機制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
mybatis的映射xml中動態(tài)設(shè)置orderby方式
這篇文章主要介紹了mybatis的映射xml中動態(tài)設(shè)置orderby方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
java構(gòu)造器 默認構(gòu)造方法及參數(shù)化構(gòu)造方法
構(gòu)造器也叫構(gòu)造方法、構(gòu)造函數(shù),是一種特殊類型的方法,負責(zé)類中成員變量(域)的初始化。構(gòu)造器的用處是在創(chuàng)建對象時執(zhí)行初始化,當(dāng)創(chuàng)建一個對象時,系統(tǒng)會為這個對象的實例進行默認的初始化,下面文章將進入講解,需要的朋友可以參考下2021-10-10
Java實現(xiàn)圖片上傳至服務(wù)器功能(FTP協(xié)議)
這篇文章主要為大家詳細介紹了Java實現(xiàn)圖片上傳至服務(wù)器功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
SpringBoot中的@EnableConfigurationProperties注解原理及用法
在SpringBoot中,@EnableConfigurationProperties注解是一個非常有用的注解,它可以用于啟用對特定配置類的支持,在本文中,我們將深入探討@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以參考下2023-06-06

