类初始化顺序

单类中初始化顺序

在单个类中,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是:

(静态变量、静态初始化块)>(变量、初始化块)>构造器。
  • 验证
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();
}
}

//output
父类静态变量
1
父类普通变量
父类初始化
a

继承中的类初始化顺序

在有继承关系的类中,加载的顺序为:

  1. 父类中有静态变量,静态代码块,先加载父类中的静态变量,静态代码块
  2. 子类中有静态变量,静态代码块,加载子类中的静态变量,静态代码块
  3. 父类中有变量,初始化块,加载父类中的变量,初始化块
  4. 加载父类中的构造函数
  5. 子类中有变量,初始化块,加载子类中的变量,初始化块
  6. 加载子类中的构造函数
备注:类中的静态变量,静态代码,只会加载一次。
  • 验证
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();
}
}

//output
父类静态变量
1
子类静态变量
2
父类普通变量
父类初始化
a
子类普通变量
子类初始化
b

-------------- 验证静态变量,静态代码块只加载一次 ----------------

父类普通变量
父类初始化
a
子类普通变量
子类初始化
b
Fork me on GitHub