目录
  1. 1. Java–对象的初始化流程
Java--对象的初始化流程

Java–对象的初始化流程

先说结论:

  • 无继承的情况下初始化顺序:(静态代码块、静态变量)>(普通代码块、普通变量)>(构造函数)
  • 括号里的是按代码顺序执行
  • 有继承的情况下(别人博客里的一张图,侵删):

image-20200302133814693

总的来说都是静态代码先于普通代码然后最后是构造函数这个顺序

重点: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 赋值其实被下面的初始化所覆盖了所以相当于没用
    • 按顺序执行到初始化完成。
文章作者: Archiver
文章链接: https://www.kaiming66.com/2020/02/27/Java/Java--%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E6%B5%81%E7%A8%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Archiver`s Blog
打赏
  • 微信
  • 支付寶

评论