今天看了个问题问的是类实例化过程中初始化的顺序。
虽然知道类的初始化顺序是:
父类静态块 --> 子类静态块 --> 父类自由块 --> 父类构造函数块 --> 子类自由块 --> 子类构造函数块
但是其中还是不太了解,所以写了一个测试的类(包含了接口、抽象类、父类、子类),然后debug一步一步调试,记录执行的语句
代码的注释为运行的顺序:
package com.Lland.TestInitializationOrder; /** * @discription 测试创建类实例初始化过程中调用顺序 * @author Lland * @time 2012年11月13日 02:15:37 */ public class MainClass { public static void main(String[] args) { Child child = null;//1 child = new Child();//2,12,29 } } abstract class Person{ public static String abstractStaticField = "抽象人类静态变量";//3 public String abstractField = "抽象人类变量";//17 static { System.out.println(abstractStaticField);//4 System.out.println("抽象人类静态初始化块");//5 } { System.out.println(abstractField);//18 System.out.println("抽象人类初始化块");//19 } public Person(){//15 //16进入Object类 System.out.println("抽象人类构造器");//20 } public abstract void abstractPersonPrint(); public void personPrint(){ System.out.println("抽象人类非抽象方法"); } } interface FatherInterface{ public static final String fatherInterfaceField = "父类接口常量"; public void fatherPrint(); } class Father extends Person implements FatherInterface{ public static String fatherStaticField = "父类静态变量";//6 public String fatherField = "父类变量";//21 static { System.out.println(fatherStaticField);//7 System.out.println("父类静态初始化块");//8 } { System.out.println(fatherField);//22 System.out.println("父类初始化块");//23 } public Father() {//14 System.out.println("父类构造器");//24 } public void abstractPersonPrint() { System.out.println("抽象人类抽象方法在子类中实现"); } public void fatherPrint() { System.out.println(fatherInterfaceField); } } interface ChildInterface{ public static final String childInterfaceField = "子类接口常量"; public void childPrint(); } class Child extends Father implements ChildInterface{ public static String childStaticField = "子类静态变量";//9 public String childField = "子类变量";//25 static { System.out.println(childStaticField);//10 System.out.println("子类静态初始化块");//11 } { System.out.println(childField);//26 System.out.println("子类初始化块");//27 } public Child() {//13 System.out.println("子类构造器");//28 } public void childPrint() { System.out.println(childInterfaceField); } }
测试结果:
抽象人类静态变量
抽象人类静态初始化块
父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块
抽象人类变量
抽象人类初始化块
抽象人类构造器
父类变量
父类初始化块
父类构造器
子类变量
子类初始化块
子类构造器
结果就是:父类静态块 --> 子类静态块 --> 父类自由块 --> 父类构造函数块 --> 子类自由块 --> 子类构造函数 的顺序,因为抽象类继承自Object,父类继承自抽象类,自累积成自父类。
不过知道具体的代码执行顺序了。