1、一般來說,類的代碼在初次使用時被加載。通常指創建第一個對象時(構造器其實也是static方法),或者訪問類的static域或static方法時會發生加載。
2、當類加載器開始加載第一個類的過程中如果發現該類具有基類它將繼續進行加載,直至所有的基類被加載完成
3、然后根基類的static初始化會被執行,然后是下一個導出類static域,以此類推,直至所有相關類的static域加載初始化完成。
4、至此必要的類都被加載完成,對象可以被創建。注意:基類的加載不管是否進行對象的創建都會被執行。
5、然后是根基類成員變量按順序初始化,然后調用根基類構造方法。根基類完成后以相同順序執行第一個導出類的初始化直至完成對象創建。
如下是參考代碼
package base;
/**
* 對類加載、構造方法執行順序的研究
* @author wdb
*
*/
public class InitOrder {
private String s = print("main函數所在類成員變量初始化");
private static String s1 = print("main函數所在類靜態成員變量初始化");
public InitOrder(){
System.out.println("main函數類構造執行");
}
public static void main(String[] args) {
InitOrder test = new InitOrder();
test.print("單個類加載執行完成!");
System.out.println("--------------具有繼承關系的類加載執行順序演示-------------");
Demo2 demo = new Demo2();
demo.print("具有繼承關系的類執行完畢");
}
public static String print(String s){
System.out.println(s);
return s;
}
}
class Base{
private String s=print("基類BASE私有成員初始化");
private static String s1=print("基類BASE靜態成員初始化");
public Base(){
System.out.println("基類構造方法執行");
}
public static String print(String s){
System.out.println(s);
return s;
}
}
class Demo1 extends Base{
private String s=print("導出類Demo1私有成員初始化");
private static String s1=print("導出類Demo1靜態成員初始化");
public Demo1(){
System.out.println("導出類Demo1構造方法執行");
}
}
class Demo2 extends Demo1{
private Demo demo = new Demo();
private String s=print("導出類Demo2私有成員初始化");
private static String s1=print("導出類Demo2靜態成員初始化");
public Demo2(){
System.out.println("導出類Demo2構造方法執行");
}
}
class Demo {
public Demo(){
System.out.println("Demo類構造方法執行");
}
}
/*output:
main函數所在類靜態成員變量初始化(只要main方法被執行就會有此輸出哪怕不進行對象創建)
main函數所在類成員變量初始化
main函數類構造執行
單個類加載執行完成!
--------------具有繼承關系的類加載執行順序演示-------------
基類BASE靜態成員初始化
導出類Demo1靜態成員初始化
導出類Demo2靜態成員初始化
基類BASE私有成員初始化
基類構造方法執行
導出類Demo1私有成員初始化
導出類Demo1構造方法執行
Demo類構造方法執行
導出類Demo2私有成員初始化
導出類Demo2構造方法執行
具有繼承關系的類執行完畢
*///
---------------------
作者:w574951402
來源:CSDN
原文:https://blog.csdn.net/w574951402/article/details/53012610
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
