Java Object 构造方法的执行顺序
@author ixenos
为了使用类而做的准备工作包括三个步骤
1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象
2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用
3)初始化:若该类有超类,对其初始化,执行静态初始化器和静态初始化块。
类初始化时构造方法执行顺序
对于某一个子类时:
(1)初始化对象的存储空间为零或null值;(子父类链接完毕,父类初始化完毕后)
(2)调用父类构造函数;无显式调用super(...)时,默认隐式调用super(),否则调用super(...)
(3)按顺序分别调用类成员变量(例如static int)和实例成员变量(例如int)的初始化表达式;
(4)调用本身构造函数。
public class Dollar extends Money{
Rmb r=new Rmb(); public Dollar(){ System.out.println("Dollar is construct!"); }
public static void main(String[] args){ new Dollar(); }
}
class Money{
public Money(){
System.out.println("Money is construct");
}
}
class Rmb{
public Rmb(){
System.out.println("RMB is construct");
}
} /*
输出结果:
Money is construct
RMB is construct
Dollar is construct!
*/
实例化某一个类的对象的时,块和构造器的相对运行顺序
(1)父类静态块
(2)子类静态块
(3)父类块
(4)父类构造器
(5)子类块
(6)子类构造器
public class Dog {
public Dog() {
System.out.println("Dog");
}
static{ //静态块
System.out.println("super static block");
}
{ //普通块
System.out.println("super block");
}
}
public class Mastiff extends Dog {
public Mastiff() {
System.out.println("Mastiff");
}
{
System.out.println("block");
}
static {
System.out.println("static block");
}
public static void main(String[] args){
Mastiff mastiff=new Mastiff(); //实例化一个对象
}
} /*
输出结果:
super static block
static block
super block
Dog
block
Mastiff
*/