Java类加载及初始化顺序

时间:2022-03-06 22:24:17

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构造方法执行

具有继承关系的类执行完毕
*///