对象实例的初始化顺序

对象实例的初始化顺序

  1. java 对象初始化时,会先加载对应的类,随后加载其基类(如果存在基类);
  2. 先从基类执行static 初始化,后执行子类static 初始化。static初始化顺序:静态变量和静态初始化块的执行顺序取决于它们的代码位置顺序。
  3. 此时,类加载完毕,开始对象的初始化。先执行基类初始化,后执行衍生类初始化。对象初始化的顺序:
    • 属性得到初值:基本值类型为默认值;对象句柄为null;
    • 属性定义时的初始化(例如int i =1)和代码块,的执行顺序取决于它们的代码位置顺序。
    • 构造函数;
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
public class TestLoad extends Parent {
static int prt(String s) {
System.out.println(s);
return 63;
}
// 此处可以看到静态代码块和静态属性的顺序取决于代码位置
static int staticProperty2 = prt("static property 2 initialized : TestLoad");
static {
System.out.println("class load : TestLoad");
}

int property_k = prt("property k initialized : TestLoad");
{
System.out.println("property init : TestLoad");
}
TestLoad() {
System.out.println("TestLoad : property_k = " + property_k);
property_k = property_k+1;
System.out.println("TestLoad : property_k = " + property_k);
System.out.println("TestLoad : property_j = " + property_j);
}

public static void main(String[] args) {
System.out.println("new instance >>> TestLoad");
TestLoad b = new TestLoad();
}

}

class Parent {
static int prt(String s) {
System.out.println(s);
return 47;
}
static {
System.out.println("class load : Parent");
}
Parent() {
System.out.println("Parent : property_i = " + property_i);
System.out.println("Parent: property_j = " + property_j);
property_i = 39;
}
{
property_i = 1; //显然对象先初始化 property_i 为0,然后执行代码块,再执行定义property_i的值prt("property i initialized : Parent")
System.out.println("property init : Parent");
}
static int staticProperty1 = prt("static property 1 initialized : Parent");
int property_i =prt("property i initialized : Parent");
int property_j;

}
/**
* class load : Parent
* static property 1 initialized : Parent
* static property 2 initialized : TestLoad
* class load : TestLoad
* new instance >>> TestLoad
* property init : Parent
* property i initialized : Parent
* Parent : property_i = 47
* Parent: property_j = 0
* property k initialized : TestLoad
* property init : TestLoad
* TestLoad : property_k = 63
* TestLoad : property_k = 64
* TestLoad : property_j = 0
*/
-------------本文结束感谢您的阅读-------------
坚持分享,您的支持将鼓励我继续创作!
0%