在許多傳統語言中,程式是作為啟動過程的一部分被加載的。然後是初始化,緊接着程式開始運作。這些語言的初始化過程必須小心控制,以確定定義為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成員被通路時加載的
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
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方法