面向对象编程
属性初始化顺序
1 属性初始化的情况
1) 默认初始化
2) 显式初始化
3) 构造器初始化
4) 调用初始化
5) 代码块初始化
2 属性初始化的顺序
1) 针对对象的属性初始化,不同情况的属性初始化顺序:
默认初始化 - 显式初始化 or 代码块初始化 - 构造器初始化 - 调用初始化
2) 理解
- 默认初始化:理解为为类或对象开辟空间(包括各个成员的空间)时进行的属性初始化;
- 显式初始化 or 代码块初始化:理解为类或对象开辟空间后加载(各个成员)具体内容时的属性初始化;
因此,显式初始化与代码块初始化的顺序取决于二者的加载顺序,也就是说,在类中代码块初始化定义在显式初始化之前,则先代码块初始化,否则先显式初始化。
但一般也不会在类中先写代码块初始化后写显式初始化。 - 构造器初始化:一方面,静态代码块随类加载而加载,而构造器中的初始化依赖于对象的创建,因此静态代码块的属性初始化一定先于构造器中的属性初始化;
另一方面,构造器初始化时,经历的过程仍然是先开辟对象空间,再加载对象具体内容,最后再进行构造器内部的初始化代码。也就是说,构造器初始化本质上仍是调用初始化,只不过是在对象创建完成后马上进行调用。
因此,构造器初始化后于显式初始化和代码块初始化。 - 调用初始化:调用依赖于先有类或对象,因此针对对象属性初始化,调用初始化后于构造器初始化。