构造器在运行前系统执行什么呢,之后又执行什么呢?总结如下:
- 加载要创建该对象的父类,以及成员变量和其他继承关系;
- 加载该类的静态块和静态成员变量,并对其进行初始化等操作;
- 静态块和静态成员变量加载完毕后创建对象并加载非静态成员变量,并对其进行初始化等操作;
- 执行构造器里的方法体,完成后该类的对象创建完毕。
- 父类的运行顺序和该类的运行顺序是一样的。
简单概括为:
父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造函数-->子类非静态代码块-->子类构造函数-->执行子类相应方法
下面是一段复杂的代码,来说明有继承关系的构造器是何时运行的。
class fruit
{
//父类静态代码块
static
{
System.out.println("父类的静态代码块执行");
}
//父类非静态代码块
{
System.out.println("父类的非静态代码块执行");
}
//创建一个父类的无参构造函数
public fruit()
{
System.out.println("父类的构造函数执行");
}
//父类的方法
public void show()
{
System.out.println("父类的其他方法执行");
}
}
public class apple extends fruit
{
//子类静态代码块
static
{
System.out.println("子类的静态代码块执行");
}
//子类非静态代码块
{
System.out.println("子类的非静态代码块执行");
}
//创建一个子类的无参构造函数
public apple()
{
System.out.println("子类的构造函数执行");
}
//子类的方法
public void show()
{
System.out.println("子类的其他方法执行");
}
public static void main(String[] args)
{
//创建对象实例,并执行相应的方法
apple a=new apple();
a.show();
}
}
运行结果如下:
父类的静态代码块执行
子类的静态代码块执行
父类的非静态代码块执行
父类的构造函数执行
子类的非静态代码块执行
子类的构造函数执行
子类的其他方法执行
解析:在有继承关系的时候,是先初始化父类的各个成员。创建apple对象的时候,先初始化父类的静态块和静态成员变量,再初始化子类的静态块和静态成员变量;接着执行父类的非静态代码块(如果有的话),之后进入到父类的构造器方法里执行该构造器的方法体。父类构造器方法体执行完毕后,执行子类的非静态代码块(如果有的话),之后执行子类构造器的方法体。子类构造器方法体执行完毕后,执行相应的方法。