【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题。首先来看一个例子

/**
 * Created by lili on 15/10/19.
 */

class Person{
    static {
        System.out.println("执行Person静态代码块");
    }

    {
        System.out.println("执行Person构造代码块");
    }
    public Person(){
        System.out.println("执行Person构造方法");
    }
}

class Student extends Person{
    static {
        System.out.println("执行Student静态代码块");
    }

    {
        System.out.println("执行Student构造代码块");
    }
    public Student(){
        System.out.println("执行Student构造方法");
    }
}
public class ExtendsStaticConstruct {
    public static void main(String args[]){
        Student student = new Student();
    }

}

 

执行结果如下:

执行Person静态代码块
执行Student静态代码块
执行Person构造代码块
执行Person构造方法
执行Student构造代码块
执行Student构造方法

Process finished with exit code 0

 

 

说明程序的执行顺序是:

  静态代码块 ---》    构造代码块 ----》  构造方法

执行流程解释:
  new的是Student类,但是Student是继承子Person类,所以在加载Student类时先要加载Person类,而静态的内容是随着类的加载而加载的,所以先打印“执行Person静态代码块”,后执行Student的静态代码块。

  加载完类后,开始走main方法,执行Student构造方法上,即初始化Student,但是Student是继承自Person,必须先初始化Person,所以先调用Person类的空参构造方法进行初始化,但是Person类的构造代码块优先于构造方法执行,所以Person类的构造代码块先执行,构造方法后执行。然后再执行Student类的构造代码块和构造方法。

  这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化,即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,先进性成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种--》显示初始化,例如给int型显示初始化了值--》构造方法初始化,所以是这里执行到了构造方法。

      但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关,下面代码很好的解释了这点。

 

/**
 * Created by lili on 15/10/19.
 */

class Person{
    static {
        System.out.println("执行Person静态代码块");
    }

    {
        System.out.println("执行Person构造代码块");
    }

    public Person(){
        System.out.println("执行Person无参构造方法");
    }

    public Person(String name){
        System.out.println("执行Person构造方法"+ name);
    }
}

class Student extends Person{

    static {
        System.out.println("执行Student静态代码块");
    }
    {
        System.out.println("执行Student构造代码块");
    }
    public Student(String name){
        super(name);
        System.out.println("执行Student构造方法" + name);
    }
    public Student(){
        super();
        System.out.println("执行Student无参构造方法");
    }




}
public class ExtendsStaticConstruct {
    public static void main(String args[]){
        Student student1 = new Student("lili");

        System.out.println("--------------------");
        Student student2 = new Student();

    }

}

 

结果:

执行Person静态代码块
执行Student静态代码块
执行Person构造代码块
执行Person构造方法lili
执行Student构造代码块
执行Student构造方法lili
--------------------
执行Person构造代码块
执行Person无参构造方法
执行Student构造代码块
执行Student无参构造方法

Process finished with exit code 0

  

 

posted @ 2015-10-19 15:35  FightingBoy&Gril  阅读(3330)  评论(0编辑  收藏  举报