在其他博客看到过这种关于初始化顺序的文章,仔细一想,自己还真的不太清楚具体的顺序是什么样的,搞段代码测试一下:
class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。
public class LoaderOrderParent { static{ System.out.println("父类--静态代码块"); } { System.out.println("父类--代码块"); } public static String staticStringParent=initStaticStringInParent(); public String stringInParent=initStringInParent(); public LoaderOrderParent(){ System.out.println("父类--构造方法"); } public static String initStaticStringInParent(){ System.out.println("父类--初始化静态变量"); return "initStaticStringInParent"; } public String initStringInParent(){ System.out.println("父类--初始化普通变量"); return "initStringInParent"; } } public class LoaderOrderChild extends LoaderOrderParent { public String stringInChild=initStringInChild(); public static String staticStringInChild=initStaticStringInChild(); { System.out.println("子类--方法块"); } static { System.out.println("子类--静态方法块"); } public LoaderOrderChild(){ System.out.println("子类--构造方法"); } public static String initStaticStringInChild(){ System.out.println("子类--初始化静态变量"); return "staticStringInChild"; } public String initStringInChild(){ System.out.println("子类--初始化普通变量"); return "stringInChild"; } public static void main(String[] args){ new LoaderOrderChild(); } }
在子类中,执行main方法,new LoaderOrderChild();
输出结果为:
父类--静态代码块
父类--初始化静态变量
子类--初始化静态变量
子类--静态方法块
父类--代码块
父类--初始化普通变量
父类--构造方法
子类--初始化普通变量
子类--方法块
子类--构造方法
虽然子类的普通代码块写在静态代码块前面,但是还是静态代码库先执行