java类的初始化顺序 多说无益,以下是本人亲自试验的代码,一目了然:
1 package test1; 2 3 public class test { 4 public static void main(string[] argc) { 5 new child(); 6 system.out.println(================================); 7 new child(); 8 } 9 }10 11 class child extends parent{12 private static string staticfield = getstaticfield();13 static {14 system.out.println(child静态方法块初始化);15 }16 private string field = getfield();17 {18 system.out.println(child普通方法块初始化);19 }20 21 public child() {22 system.out.println(child构造函数初始化);23 }24 25 public static string getstaticfield() {26 system.out.println(child静态属性初始化);27 return staticfield;28 }29 30 public static string getfield() {31 system.out.println(child普通属性初始化);32 return field;33 }34 }35 36 class parent {37 private static string staticfield = getstaticfield();38 static {39 system.out.println(parent静态方法块初始化);40 }41 private string field = getfield();42 {43 system.out.println(parent普通方法块初始化);44 }45 46 public parent() {47 system.out.println(parent构造函数初始化);48 }49 50 public static string getstaticfield() {51 system.out.println(parent静态属性初始化);52 return staticfield;53 }54 55 public static string getfield() {56 system.out.println(parent普通属性初始化);57 return field;58 }59 }
打印结果:
1 parent静态属性初始化 2 parent静态方法块初始化 3 child静态属性初始化 4 child静态方法块初始化 5 parent普通属性初始化 6 parent普通方法块初始化 7 parent构造函数初始化 8 child普通属性初始化 9 child普通方法块初始化10 child构造函数初始化11 ================================12 parent普通属性初始化13 parent普通方法块初始化14 parent构造函数初始化15 child普通属性初始化16 child普通方法块初始化17 child构造函数初始化
经过替换静态属性和静态初始化块的声明顺序发现静态属性和静态初始化块的初始化顺序和声明顺序有关,同理,普通属性和普通初始化块的的初始化顺序和声明顺序有关。
总结:
当某一个类满足初始化的条件时(以后的博客中会有总结),先会初始化父类(从顶级父类object依次向下初始化),然后初始化子类;
初始化该类时,最先初始化静态属性和静态初始化块(和声明顺序有关),从顶级父类object依次向下初始化;
通过new创建对象时,先初始化普通属性和普通初始化块(和声明顺序有关),再调用构造方法,同样从顶级父类object依次向下执行;
静态属性和静态初始化块只会初始化一次,类初始化后,再次通过new创建对象,只会重复执行第三步。
接下来引用java编程思想的一句话:
在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
以上就是java类的初始化顺序是什么的详细内容。