一直对构造代码块、静态代码块、无参构造函数和有参构造函数的执行顺序和执行次数混淆不清,所以记录一下它们的执行顺序以及执行次数。记录的不是很详细,留待补充。
代码:
package com.yoko.test1;
class FatherModel {
{
System.out.println("执行父类构造代码块");
}
static{
System.out.println("执行父类静态代码块");
}
public FatherModel(){
System.out.println("执行父类无参构造方法");
}
public FatherModel(String arg){
System.out.println("执行父类有参构造方法");
}
}
class SunModel extends FatherModel{
{
System.out.println("执行子类构造代码块");
}
static{
System.out.println("执行子类静态代码块");
}
public SunModel(){
System.out.println("执行子类无参构造方法");
}
public SunModel(String arg){
System.out.println("执行子类有参数构造方法");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println("创建父类实例,不考虑继承情况");
FatherModel fatherModel1 = new FatherModel();
System.out.println("------------------------------------------------------");
FatherModel fatherModel2 = new FatherModel("abc");
System.out.println("------------------------------------------------------");
System.out.println("创建子类实例,考虑继承情况");
SunModel sunModel1 = new SunModel();
System.out.println("------------------------------------------------------");
SunModel sunModel2 = new SunModel();
System.out.println("------------------------------------------------------");
SunModel sunModel3 = new SunModel("abc");
}
}
运行结果:
创建父类实例,不考虑继承情况
执行父类静态代码块
执行父类构造代码块
执行父类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类有参构造方法
------------------------------------------------------
创建子类实例,考虑继承情况
执行子类静态代码块
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类无参构造方法
------------------------------------------------------
执行父类构造代码块
执行父类无参构造方法
执行子类构造代码块
执行子类有参数构造方法
通过运行结果可以知道,
- 不存在继承情况:首先执行【静态代码块】,并且【静态代码块】只执行一次,和对象初始化次数无关;其次执行【构造代码块】,每一次初始化对象都会执行一次;最后执行【构造方法】,根据是使用的构造方法来执行。
- 存在继承情况:1、执行【父类静态代码块】,并且【父类静态代码块】只执行一次,和对象初始化次数无关;2、执行【子类静态代码块】,并且【子类静态代码块】之执行一次,和对象初始化次数无关;3、执行【父类构造代码块】,每一次初始化对象都会执行一次;4、执行【父类无参构造方法】,每一次初始化对象都会执行一次;5、执行【子类构造代码块】,每一次初始化对象都会执行一次;6、执行【子类构造方法】,根据使用的构造方法来执行。