Java–对象的初始化流程
先说结论:
- 无继承的情况下初始化顺序:(静态代码块、静态变量)>(普通代码块、普通变量)>(构造函数)
- 括号里的是按代码顺序执行
- 有继承的情况下(别人博客里的一张图,侵删):
总的来说都是静态代码先于普通代码然后最后是构造函数这个顺序
重点:static 修饰的变量或者代码块只加载一次
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 InitializeTest {
private static int k = 1; private static InitializeTest t1 = new InitializeTest("t1"); private static InitializeTest t2 = new InitializeTest("t2"); private static int i = print("i"); static { print("静态构造块"); n=100; } private static int n = 99; { print("构造块"); j = 100; } private int j = print("j"); public static int print(String str){ System.out.println((k++) + " :" + str + " i=" + i + " n=" + n); ++n; return ++i; }
public InitializeTest(String str){ System.out.println((k++) + " :" + str + " i=" + i + " n=" + n); ++i; ++n; }
public static void main(String[] args) { InitializeTest initializeTest = new InitializeTest("初始化"); } }
|
1 2 3 4 5 6 7 8 9 10 11
| 1 :构造块 i=0 n=0 2 :j i=1 n=1 3 :t1 i=2 n=2 4 :构造块 i=3 n=3 5 :j i=4 n=4 6 :t2 i=5 n=5 7 :i i=6 n=6 8 :静态构造块 i=7 n=7 9 :构造块 i=8 n=99 10 :j i=9 n=100 11 :初始化 i=10 n=101
|
- 简单梳理下流程,我们要初始化这个类,然后按从上到下顺序执行代码:
- 首先是类变量 k 初始化为 1
- 然后是一个静态类自己本身,而静态代码只执行一次,所以这次他只初始化普通代码块所以第一行结果为构造块
- 这时用到类变量 i ,我们调用 print 方法
- 然后该构造函数 t1
- t2 同理
- t2 初始化完后继续按代码流程走该类变量 i
- 静态代码块,它里面的给 n 赋值其实被下面的初始化所覆盖了所以相当于没用
- 按顺序执行到初始化完成。