Java中构造方法、成员变量、代码块执行顺序
在网上看到有关Java中代码执行顺序的题目,第一次回答发现和答案不一致,于是想要亲自做个实验验证一下,解答心中的疑惑。
代码准备
创建父类Dog
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
37public class Dog {
private String name = getName();
private static String gender = getGender();
public String getName() {
System.out.println("==>父类普通成员变量初始化");
return "Dog";
}
public static String getGender() {
System.out.println("==>父类静态成员变量初始化");
return "male";
}
static {
System.out.println("==>父类静态代码块1");
}
{
System.out.println("==>父类普通代码块1");
}
public Dog() {
System.out.println("==>父类构造方法");
}
static {
System.out.println("==>父类静态代码块2");
}
{
System.out.println("==>父类普通代码块2");
}
}创建子类Husky
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
37public class Husky extends Dog {
private int age = getAge();
private static String color = getColor();
public int getAge() {
System.out.println("==>子类普通成员变量初始化");
return 2;
}
public static String getColor() {
System.out.println("==>子类静态成员变量初始化");
return "BlackAndWhite";
}
static {
System.out.println("==>子类静态代码块1");
}
{
System.out.println("==>子类普通代码块1");
}
public Husky() {
System.out.println("==>子类构造方法");
}
static {
System.out.println("==>子类静态代码块2");
}
{
System.out.println("==>子类普通代码块2");
}
}创建测试主类
1
2
3
4
5
6
7
8
9
10
11public class TestRunOrder {
public static void main(String[] args) {
new Husky();
System.out.println("");
new Husky();
}
}
测试结果
1 | ==>父类静态成员变量初始化 |
结论
- 父类静态成员变量/代码块>子类静态成员变量/代码块
- 父类普通成员变量/代码块>子类普通成员变量/代码块
- 父类构造方法>子类构造方法
- 静态成员变量/代码块、普通成员变量/代码块执行顺序和代码位置一致