类的加载顺序如下所示:
- 父类静态对象和静态代码块
- 子类静态对象和静态代码块
- 父类非静态对象和非静态代码块
- 父类构造函数
- 子类非静态对象和非静态代码块
- 子类构造函数
其中1和2中的静态块按照声明顺序依次执行,在类加载到方法区的时候执行的,不需要new类的实例,而且只需执行一次。而非静态代码块是在创建对象时执行,执行顺序为静态块>main()>构造块>构造方法。
代码示例:
/*
* 1. 父类静态对象和静态代码块
* 2. 子类静态对象和静态代码块
* 3. 父类非静态对象和非静态代码块
* 4. 父类构造函数
* 5. 子类非静态对象和非静态代码块
* 6. 子类构造函数
* */
class Base{
public Base(){
System.out.println("base constructor");
}
static{
System.out.println("base static");
}
{
System.out.println("base no-static");
}
}
public class TestLoadOrder extends Base{
public TestLoadOrder(){
System.out.println("son constructor");
}
//非静态代码块
{
System.out.println("son no-static");
}
//静态代码块
static
{
System.out.println("son static");
}
public static void main(String[] args)
{
TestLoadOrder t1 = new TestLoadOrder();
}
}
输出:
base static
son static
base no-static
base constructor
son no-static
son constructor