文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書
1. Java中的初始化
Java與C++的一個(gè)不同之處在于,Java不僅有構(gòu)造函數(shù)麻掸,還有一個(gè)“初始化塊”(Initialization Block)的概念。Java中的初始化塊在創(chuàng)建Java對(duì)象時(shí)隱式執(zhí)行蛛蒙,并且是在構(gòu)造函數(shù)之前執(zhí)行酝蜒。
2. 靜態(tài)初始化
// 定義
static {
...
}
靜態(tài)初始化塊執(zhí)行的優(yōu)先級(jí)高于非靜態(tài)初始化塊咙俩,在對(duì)象裝載到JVM中時(shí)執(zhí)行一次弦悉,僅能初始化類成員變量窒典,即static修飾的數(shù)據(jù)成員蟆炊。
3. 非靜態(tài)初始化
// 定義
{
...
}
非靜態(tài)初始化塊在每個(gè)對(duì)象生成時(shí)都會(huì)被執(zhí)行一次稽莉,它可以初始化類的實(shí)例變量。非靜態(tài)初始化塊在構(gòu)造函數(shù)之前執(zhí)行涩搓。
4. Demo
- Example
class Test {
static {
System.out.println("Run static initailization block.");
}
{
System.out.println("Run nonstatic initailization block.");
}
public Test() {
System.out.println("Run Test constructor.");
}
public static void main(String[] args) {
Test t = new Test();
}
}
- Result
Run static initailization block.
Run nonstatic initailization block.
Run Test constructor.
5. 總結(jié)
從某種程度上來看污秆,初始化塊是構(gòu)造器的補(bǔ)充劈猪,初始化塊總是在構(gòu)造器之前執(zhí)行。初始化塊是一段固定執(zhí)行的代碼良拼,它不能接受任何參數(shù)战得。因此初始化塊對(duì)同一個(gè)類的所有對(duì)象所進(jìn)行的初始化處理完全相同。如果有一段初始化處理代碼對(duì)所有的對(duì)象完全相同庸推,且無需接受任何參數(shù)常侦,就可以把這段初始化處理代碼提取到初始化塊中。通過把多個(gè)構(gòu)造器中的相同代碼提取到初始化塊中定義贬媒,能更好地提高初始化代碼的復(fù)用聋亡。靜態(tài)初始化塊是類相關(guān)的,系統(tǒng)將在類加載時(shí)執(zhí)行靜態(tài)初始化塊际乘,而不是在創(chuàng)建對(duì)象時(shí)才執(zhí)行坡倔,因此靜態(tài)初始化塊總是比非靜態(tài)初始化塊先執(zhí)行。用途:例如在JNI調(diào)用時(shí)脖含,需要加載動(dòng)態(tài)鏈接庫罪塔,就可以在靜態(tài)代碼塊中加載。