关于类加载和初始化时内部元素加载顺序一直是一个我们会搞错的问题,其实关于一个类初始化是类的内部加载顺序如下:
1.当一个类加载时:【没有除了Object以外的其它父类时候】
首先是静态内容【静态成员变量--->静态代码块---->静态方法】---->构造代码块--->构造函数【几乎和构造代码块一起,只是要在构造函数内容之前执行】--->成员变量---->普通方法【局部变量---->局部代码块】
2.当一个类加载时:【除了Object以外还有其它的父类时候】
当初始化子类对象时,首先要加载父类对象,加载父类对象时候也是先加载类成员【被static修饰的】,有静态的先加载静态的,当父类的静态加载完事后,加载子类静态的【这时候要注意是父类的类静态加载完之后,立刻加载子类的静态】,之后是父类的构造代码块和构造函数,紧接着是子类的构造代码块和构造方法,之后是子类继承的父类的方法,成员变量等。
如果存在多重父类,递归加载,规则如上:
public class Test{
public static void main(String[] args) {
new HelloB();
}
}
class HelloA{
//构造函数
public HelloA() {
System.out.println("I'm HelloA 的构造函数");
}
//构造代码块
{
System.out.println("I'm HelloA class");
}
//静态代码块
static {
System.out.println("I'm staticA ");
}
}
class HelloB extends HelloA{
public HelloB() {
System.out.println("I'm HelloB 的构造函数");
}
{
System.out.println("I'm HelloB class");
}
static {
System.out.println("I'm staticB ");
}
}
运行结果:
I'm staticA
I'm staticB
I'm HelloA class
I'm HelloA 的构造函数
I'm HelloB class
I'm HelloB 的构造函数
I'm staticB
I'm HelloA class
I'm HelloA 的构造函数
I'm HelloB class
I'm HelloB 的构造函数