先上结论
- 外部类加载时,会初始化静态变量、静态代码块,但是并不会加载静态内部类和普通内部类
- 实例化类时,会先初始化类的普通代码块,再执行类的构造方法
- 直接调用类的静态内部类时,外部类不会加载。
测试代码:
public class ClassLoadTest {
static {
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
public classLoadTest(){
System.out.println("构造函数");
}
public static void main(String[] args) {
System.out.println("main方法执行");
}
输出:
静态代码块
main方法执行
可以看出在执行main方法前,会初始化mian方法所在类的静态成员(包括静态变量、静态代码块),所以静态代码块的内容在mian方法前执行。静态变量和静态代码块的初始化循环,按代码编写的顺序依次执行,即谁写在前面谁初始化。