對于
JAVA中變量的初始化是一個很基礎(chǔ)的問題,其中的一些問題也是易被
學(xué)習(xí)者所忽略。當(dāng)在編寫代碼的時候碰到時,常被這些問題引發(fā)的錯誤,感覺莫名其妙。而且現(xiàn)在許多大公司的
面試題,對于這方面的考查也是屢試不爽。以下是對java變量初始化的時機的分析。
【java變量執(zhí)行初始化的步驟】
java是一門強類型語言,因此java語言規(guī)定每個變量必須先聲明,然后才能使用,聲明變量時必須指定該變量的數(shù)據(jù)類型。首先看下面這條語句的執(zhí)行過程:
int a = 5;
實際上面這條語句會被拆分成兩個過程執(zhí)行:
(1)int a ;//創(chuàng)建java對象時根據(jù)該語句為變量分配內(nèi)存空間;
(2)a = 5;//賦值操作會最終被提取到構(gòu)造器中執(zhí)行初始化操作。
實際上在java中,在使用new操作符創(chuàng)建一個類的實例對象的時候,開始分配空間并將成員變量初始化為默認(rèn)的數(shù)值,在這里并不是指將變量初始化為在變量定義處的初始值,對于基本類型變量,默認(rèn)值空值是0或false,對于引用類型變量,默認(rèn)空值為null。這一切都是在構(gòu)造函數(shù)執(zhí)行之前,變量的真正初始化是在構(gòu)造函數(shù)中執(zhí)行。
【java中變量初始化的時機】
1、程序可以在3個地方對實例變量進行初始化:
(1)定義實例變量的時候指定初始值;
(2)非靜態(tài)初始化代碼塊中對實例變量指定初值;
(3)構(gòu)造器中對實例變量指定初值。
雖然程序在3個地方都可對實例變量指定初始值,但(1)、(2)處的賦值操作最終會被提取到構(gòu)造器中執(zhí)行。且(1)、(2)的執(zhí)行順序與他們在源程序中出現(xiàn)的順序相同。可以通過JDK的javap工具來看程序的執(zhí)行過程:
2、java中類變量初始化的時機:
(1)定義類變量的時候指定初始值;
(2)靜態(tài)初始化代碼塊中對類變量指定初值。
這里類變量初始化的時機為兩處,而沒有在構(gòu)造器中這一說。這也很容易理解,因為類變量是類加載的時候執(zhí)行的初始化,且只執(zhí)行一次,而調(diào)用構(gòu)造器是對象實例化執(zhí)行的,每實例化一次對象,執(zhí)行一次。