天天看點

java初始化加載_JAVA初始化及類的加載

在許多傳統語言中,程式是作為啟動過程的一部分被加載的。然後是初始化,緊接着程式開始運作。這些語言的初始化過程必須小心控制,以確定定義為static的東西,其初始化順序不會造成麻煩。例如C++期望一個static在另一個static在被初始化之前就能有效的使用它,那麼就會出現問題。

java不會出現這種問題,java采用了一種不同的加載方式。每個類的編譯代碼隻有在初次使用時才加載。這通常是指加載發生在建立類的第一個對象之時,但是當通路static域或static方法時,也會發生加載。

初次使用之處也是static初始化發生之處。所有static對象和static代碼段都會在加載時依程式中的順序【定義類的書寫順序】而一次初始化。當然,定義為static的東西隻會被初始化一次。

注意點:

構造器也是static方法,盡管static關鍵字并沒有顯式的寫出來。是以更準确的講,類是在其任何static成員被通路時加載的

在許多傳統語言中,程式是作為啟動過程的一部分被加載的。然後是初始化,緊接着程式開始運作。這些語言的初始化過程必須小心控制,以確定定義為static的東西,其初始化順序不會造成麻煩。例如C++期望一個static在另一個static在被初始化之前就能有效的使用它,那麼就會出現問題。

java不會出現這種問題,java采用了一種不同的加載方式。每個類的編譯代碼隻有在初次使用時才加載。這通常是指加載發生在建立類的第一個對象之時,但是當通路static域或static方法時,也會發生加載。

初次使用之處也是static初始化發生之處。所有static對象和static代碼段都會在加載時依程式中的順序【定義類的書寫順序】而一次初始化。當然,定義為static的東西隻會被初始化一次。

注意點:

構造器也是static方法,盡管static關鍵字并沒有顯式的寫出來。是以更準确的講,類是在其任何static成員被通路時加載的

java初始化加載_JAVA初始化及類的加載
java初始化加載_JAVA初始化及類的加載

public classInsect {private int i=9;protected intj;

Insect(){

System.out.println("i="+i+",j="+j);

j=39;

}private static int x1=printInit("static Insect.x1 initialized");static intprintInit(String s){

System.out.println(s);return 47;

}

}

View Code

java初始化加載_JAVA初始化及類的加載
java初始化加載_JAVA初始化及類的加載

public class Bettle extendsInsect{private int k=printInit("Beetle.k init");publicBettle(){

System.out.println("k="+k);

System.out.println("j="+j);

}private static int x2=printInit("static Beetle.x2 init");public static voidmain(String[] args) {

System.out.println("Bettle constructor");//Bettle bettle=new Bettle();

}

}

View Code

output:

static Insect.x1 initialized

static Beetle.x2 init

Bettle constructor

i=9,j=0

Beetle.k init

k=47

j=39

1.基類的static代碼段會優先與派生類的static初始化

2.基類的構造優先發生于派生類的構造器:其實本質也是一個static方法