相信好多人對(duì)Java初始化問題一直存有疑惑,下面是我看到的比較詳細(xì)的java初始化問題講解
一 java初始化基礎(chǔ)知識(shí)
1、 一個(gè)類的所有基本類型數(shù)據(jù)成員都會(huì)保證獲得一個(gè)初始值。
非基本類型,會(huì)初始化為null
出來(lái)結(jié)果為
可見,java會(huì)為類的基本類型的變量提供一個(gè)初始值,各類型初始值不同,非基本類型初始為null。注意,這里的變量必須是類變量,注意,只會(huì)為類變量提供初始化,而局部變量不會(huì)。如果局部變量沒有初始化,會(huì)收到一個(gè)出錯(cuò)信息
2、可以通過構(gòu)造方法或其他方法進(jìn)行初始化,但是不會(huì)妨礙java默認(rèn)的初始化
看下面的例子
輸出結(jié)果為
由此可見,不論是基本類型,還是其他的類。java默認(rèn)的初始化是最先發(fā)生的,位于一切方法之前。
3、static 數(shù)據(jù)的初始化
static 數(shù)據(jù)會(huì)發(fā)生上述同樣的事情(基本類型,獲得對(duì)應(yīng)基本類型的初始化值;非基本類型,初始化為null)
但是,由于static值只有一個(gè)存儲(chǔ)區(qū)域,所以static值只會(huì)被初始化一次,看下面的例子
輸出結(jié)果如下
所以說,static數(shù)據(jù)只會(huì)在第一次進(jìn)行初始化,之后就不會(huì)了。
4、初始化順序
在一個(gè)類中,無(wú)論變量的定義是在方法之前還是方法之后,都會(huì)在方法之前進(jìn)行初始化的;
另外,static數(shù)據(jù)初始化位于非static數(shù)據(jù)初始化之前
來(lái)看下邊的例子
結(jié)果如下
5、靜態(tài)塊
靜態(tài)塊里的變量初始化順序位于普通變量之前,和static變量相比,則是完全由定義的順序來(lái)決定了。另外,靜態(tài)塊里的變量也是只初始化一次,這點(diǎn)和static變量一致。示例如下
輸出結(jié)果為
如果調(diào)換static變量和靜態(tài)塊的位置,輸出結(jié)果如下
6、涉及到繼承時(shí) 初始化順序
初始化時(shí),如果有static變量或靜態(tài)塊,其初始化順序是位于最前面的,無(wú)論變量位于子類還是父類中,它們二者之間的順序,可參見第5點(diǎn);
static變量初始完了后,先初始化父類,然后是子類。
示例如下
輸出結(jié)果如下
二 問題舉例
package test;
class Singleton {
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance() {
return obj;
}
}
public class MyMain {
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}
這段程序代碼輸出,實(shí)際運(yùn)行結(jié)果:
obj.counter1==1
obj.counter2==0
相信大家跟我一樣會(huì)對(duì)這個(gè)結(jié)果存有疑問,這段代碼中尤其注意:private static Singleton obj = new Singleton(); 在類Singleton中的位置,改變位置會(huì)有不同結(jié)果。關(guān)于這段代碼運(yùn)行結(jié)果的解釋:
當(dāng)程序執(zhí)行private static Singleton obj = new Singleton(); 句的時(shí)候就去調(diào)用了Singleton構(gòu)造器,此時(shí)counter1、counter2都是1,但是接著執(zhí)行向下執(zhí)行:public static int counter1;時(shí)將1賦給counter1,執(zhí)行public static int counter2 = 0;時(shí)重新給counter2賦值為0
三 典型初始化例子
Java初始話很好的一個(gè)例子, 摘自Think in Java
聯(lián)系客服