【0】README
0.1) 本文描述+源代码均 转自 core java volume 1, 旨在分享初始化块 or 静态初始化块的调用过程;
【1】初始化块相关
1.1)前面讲过了 两种初始化数据域的方法: 在构造器中设置值 + 在声明中赋值;
1.2)java还有第3种机制, 称为初始化块: 在一个类的声明中, 可以包含多个代码块,
对以上代码的分析(Analysis)
- A1)无论使用哪一个构造器构造对象, id 域 都在对象初始化块占用被初始化。首先运行初始化块, 然后才运行构造器的主体部分;
- A2)这种机制不是必须的, 也不常见;通常 直接将 初始化代码放在构造器中;
Annotation)即使在类的后面定义,仍然可以在初始化块中设置域, 这个规则的复杂性足以使 编译器的实现者头痛 , 因此建议将初始化块放在域定义之后;
【2】看荔枝
【3】总结下调用构造器的具体步骤:
- step1)所有数据域被初始化为默认值(0、false、null);
- step2)按照在类声明中出现的次序, 依次执行所有域初始化语句和初始化块;
- step3)如果构造器第一行调用了第二个构造器, 则执行第二个构造器主体;
- step4)执行这个构造器主体;
【4】可以通过提供一个初始化值, 或者使用一个静态的初始化块来对静态域进行初始化
- 4.1)第一种机制为: private static int nextId = 1;
- 4.2)引入静态初始化块:也可以使用静态初始化块对静态域进行初始化, 将代码放在一个块中, 并标记关键字 static: