本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题。首先来看一个例子
/** * 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型显示初始化了值--》构造方法初始化,所以是这里执行到了构造方法。
时间: 2024-11-10 10:55:30