单类中初始化顺序 在单个类中,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是:
(静态变量、静态初始化块)>(变量、初始化块)>构造器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public class ExtendsTest { public static final String staticField = "父类静态变量" ; public String field = "父类普通变量" ; static { System.out.println(staticField); System.out.println("1" ); } { System.out.println(field); System.out.println("父类初始化" ); } public ExtendsTest () { System.out.println("a" ); } public static void main (String[] args) { new ExtendsTest(); } } 父类静态变量 1 父类普通变量 父类初始化 a
继承中的类初始化顺序 在有继承关系的类中,加载的顺序为:
父类中有静态变量,静态代码块,先加载父类中的静态变量,静态代码块
子类中有静态变量,静态代码块,加载子类中的静态变量,静态代码块
父类中有变量,初始化块,加载父类中的变量,初始化块
加载父类中的构造函数
子类中有变量,初始化块,加载子类中的变量,初始化块
加载子类中的构造函数
备注:类中的静态变量,静态代码,只会加载一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 public class ExtendsTest { public static final String staticField = "父类静态变量" ; public String field = "父类普通变量" ; static { System.out.println(staticField); System.out.println("1" ); } { System.out.println(field); System.out.println("父类初始化" ); } public ExtendsTest () { System.out.println("a" ); } public static void main (String[] args) { new ExtendsTest(); } } public class SonExtendsTest extends ExtendsTest { public static final String staticField = "子类静态变量" ; public String field = "子类普通变量" ; static { System.out.println(staticField); System.out.println("2" ); } { System.out.println(field); System.out.println("子类初始化" ); } public SonExtendsTest () { System.out.println("b" ); } public static void main (String[] args) { ExtendsTest a = new SonExtendsTest(); System.out.println("-------------- 验证静态变量,静态代码块只加载一次 ----------------" ); a = new SonExtendsTest(); } } 父类静态变量 1 子类静态变量 2 父类普通变量 父类初始化 a 子类普通变量 子类初始化 b -------------- 验证静态变量,静态代码块只加载一次 ---------------- 父类普通变量 父类初始化 a 子类普通变量 子类初始化 b