************************************************
静态代码块,构造代码块,构造函数在初始化时执行的顺序?
************************************************
执行顺序就是静态代码块--- 》构造代码块----》构造函数
为了不发生歧义 举一个例子(毕老师总结)
Person p =new Person();
(1). 因为new的时候用到了Person.class 如果是第一次用到Person 则JVM会先找到Person.class 并加载到内存 ( 就执行一次))
(2). 如果该类存在静态代码块,执行静态代码块 (静态代码块的执行目的就是为整个类进行初始化 就执行一次)
(3). 在堆内存中开辟空间,分配内存地址
(4). 在堆内存中建立对象的属性(非静态),并进行默认初始化(堆内存中的成员变量都有默认值)
(5). 对成员进行显示初始化
class Person{
private int age; //只有默认初始化 初始化为0
private String name ="Benjamin";//先默认初始化为null, 再显式初始化为Benjamin
}
(6). 对对象进行构造代码块初始化
(7). 对对象进行对应的构造函数初始化
(所有该类的实例在初始化的时候 都要先构造代码块初始化 无论你调用的是哪一种构造方法
每一次都走相同的构造代码块 所以 构造代码块是所有对象共性的初始化 调用的各自的构造函数是个性的初始化)
(8). 将内存地址赋值给栈内存中的p引用变量
|