构造代码块、静态代码块、无参构造函数和有参构造函数的执行顺序

一直对构造代码块、静态代码块、无参构造函数和有参构造函数的执行顺序和执行次数混淆不清,所以记录一下它们的执行顺序以及执行次数。记录的不是很详细,留待补充。

代码:

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、执行【子类构造方法】,根据使用的构造方法来执行。

你可能感兴趣的:(java基础知识)