Java中类的初始化顺序
当我们使用new创建一个对象的时候,这个对象会在类的继承体系中按以下顺序执行初始化:
1.初始化父类的静态变量和静态代码块,按它们在代码中定义的顺序执行(先定义先执行);
2.初始化子类的静态变量和静态代码块,按它们在代码中定义的顺序执行(先定义先执行);
3.初始化父类的实例变量和实例代码块,按它们在代码中定义的顺序执行(先定义先执行);
4.执行父类的构造方法;
5.初始化子类的实例变量和实例代码块,按它们在代码中定义的顺序执行(先定义先执行);
6.执行子类的构造方法。
当该类存在多层次的继承体系时,则按以上顺序递归地执行初始化。
/**
* 父类
*/
class SuperClass
{
//父类的静态代码块
static
{
System.out.println("Initalizing static block in SuperClass\n");
}
//父类的实例代码块
{
System.out.println("Initalizing instance block in SuperClass\n");
}
//父类的静态变量
public static Var StaticSuperVar = new Var("static variable in SuperClass");
//父类的实例代变量
public Var superVar = new Var("variable in SuperClass");
//父类的构造方法
public SuperClass()
{
System.out.println("Initalizing SuperClass\n");
}
}
/**
* 子类
*/
class SubClass extends SuperClass
{
//子类的静态变量
public static Var StaticSubVar = new Var("static variable in SubClass");
//子类的实例变量
public Var subVar = new Var("variable in SubClass");
//子类的静态代码块
static
{
System.out.println("Initalizing static block in SubClass\n");
}
//子类的实例代码块
{
System.out.println("Initalizing instance block in SubClass\n");
}
//子类的构造方法
public SubClass()
{
System.out.println("Initalizing SubClass\n");
}
}
/**
* 辅助类
*/
class Var
{
public Var(String name)
{
System.out.println("Initalizing " + name + "\n");
}
}
/**
* 测试类
*/
public class InitOrderTest
{
public static void main(String[] args)
{
SubClass subClass = new SubClass();
}
}
运行结果:
Initalizing static block in SuperClass
Initalizing static variable in SuperClass
Initalizing static variable in SubClass
Initalizing static block in SubClass
Initalizing instance block in SuperClass
Initalizing variable in SuperClass
Initalizing SuperClass
Initalizing variable in SubClass
Initalizing instance block in SubClass
Initalizing SubClass