以下是发生在java继承关系中静态代码块、代码块、构造方法的执行顺序的案例:
public class Homework6 { public static void main(String[] args) { new H2(); } } class H1{ { System.out.println("父类代码块"); } public H1(){ System.out.println("父类构造"); } static{ System.out.println("父类静态代码块"); } } class H2 extends H1{ static{ System.out.println("子类静态代码块"); } { System.out.println("子类代码块"); } public H2(){ System.out.println("子类构造"); } }
执行结果如下所示:
父类静态代码块
子类静态代码块
父类代码块
父类构造
子类代码块
子类构造
执行流程分析:
1.java程序中静态内容是随着类的加载而加载的,由于存在继承关系,因此先加载父类而后加载子类,相应的就是先执行父类静态代码块,再执行子类静态代码块
2.类加载完成后程序就开始执行main方法中,紧接着进行初始化工作,由于代码块执行优于构造方法,因此出现先执行父类代码块,再执行父类构造方法,紧接着子类代码块,子类构造方法。
3.类的初始化是分层初始化的,先对父类进行初始化,再对子类进行初始化。在目标类中执行顺序为:1.成员变量初始化:默认初始化----》显示初始化----》构造方法初始化