Java煩的編譯代碼都存在於其獨立的文件之中,該文件只在需要使用程序代碼時才會被加載。也就是說,Java類的代碼在初次使用時才加載。類的加載通常發生在創建類的第一個對象之時,當訪問static域或static方法時也會發生加載。所有的static對象和static代碼段都會在加載時依程序中的順序而依次初始化。
關於當訪問static域或static方法時也會發生加載,其意思是,如果我們調用一個類的靜態方法,那麼該類就會被加載,例如:
public class TestStatic {
public static void test(){
System.out.println("1");
}
static{
System.out.println("2");
}
public static void main(String[] args) {
TestStatic.test();
}
}
運行之則結果為:
2
1
如果某類有一個父類,則初始化時將先行加載其父類,編譯器不會關心開發人員是否打算創建父類的對象,例如:
public class TestStaticChild extends TestStatic{
public static void main(String[] args) {
System.out.println("3");
}
}
運行之則結果為:
2
3
------------------------------------------------------------------------------------------------------------------------------------
Java類的初始化順序為:
Main->靜態變量、靜態初始化塊、類變量、初始化塊->構造方法
曾经做过一道笔试题,没有拍下来,也没抄下来,我在记忆的基础上加了些优化,我觉得对于理解,类的初始化顺序很有帮助,写出来与诸位共享。
public class Parent {
protected static String str = getTestMsg();
static{
System.out.println("1");
}
{
System.out.println("2");
}
public Parent(){
System.out.println("3");
}
private static String getTestMsg(){
System.out.println("4");
return null;
}
static class innerClass{
static{
System.out.println("5");
}
}
public static void main(String[] args) {
Parent p = new Child();
}
}
/**
子类
**/
public class Child extends Parent {
static {
System.out.println("6");
}{
System.out.println("7");
}
public Child(){
System.out.println("8");
}
}
结果是:4,1,6,2,3,7,8