一直对构造代码块、静态代码块、无参构造函数和有参构造函数的执行顺序和执行次数混淆不清,所以记录一下它们的执行顺序以及执行次数。记录的不是很详细,留待补充。
代码:
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、执行【子类构造方法】,根据使用的构造方法来执行。