4 . 4 成员初始化;6 . 9 初始化和类装载
构建器的调用遵照下面的顺序:
(1) 调用基础类构建器。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个衍生
类,等等。直到抵达最深一层的衍生类。
(2) 按声明顺序调用成员初始化模块。
(3) 调用衍生构建器的主体。
0. 先初始化父类字段
1. 先静态字段,再实例字段
2. 当类载入虚拟机时(第一次调用静态字段,或静态方法,或实例化一个对象),初始化静态字段
3. 当创建一个类的实例时,初始化实例字段
4. 静态或实例 字段间的初始化顺序与在类的定义时,字段所处的行号顺序一致
5. 静态字段初始化过程:
1)类载入虚拟机时,分配静态字段所需内存,并清空内存,实际上就是置0:简单数据类型均为0值,布尔型为false,引用类型为null
2)执行字段定义时的赋值操作
3)执行静态初始化块的赋值操作
6. 实例字段初始化过程:
1)新建一个对象时,分配对象所需内存,当然也包括实例字段所需内存,并清空内存,实际上就是置0:简单数据类型均为0值,布尔型为false,引用类型为null
2)执行字段定义时的赋值操作
3)执行实例初始化块的赋值操作
4)执行构造方法里的赋值操作
7. 载入一个类时,若检测到它有父类,则先载入它的父类,如此递推的找到继承的根类,从根类往下执行载入
8. 方法内定义的局部变量,与类成员字段不同,方法内的局部变量定义时不会执行清空内存操作,所以必须进行赋值,初始化之后才能使用这些局部变量
9. 代码示例
class CA
{
int i;
CA(int i)
{
this.i = i;
}
}
class Test
{
static int snum1;
static int snum2 = 2;//定义时的赋值操作
static CA sca1;
static CA sca2 = new CA(2);
static
{//静态初始化话块里的的赋值操作
snum1 = 1;
snum2 = 22;
sca1 = new CA(1);
}
int num3;
int num4 = 4;//定义时的赋值操作
CA ca3 = null;
CA ca4 = new CA(4);
{//实例初始化话块里的的赋值操作
num3 = 3;
num4 = 44;
ca3 = new CA(3);
}
Test()
{{//构造方法里的的赋值操作
num4 = 444;
ca4 = new CA(44);
}
}
snum2 初始化过程中值的变化为:0(清空内存)、2(定义时赋值)、22(静态初始化块内赋值)
num4 初始化过程中值的变化为:0(清空内存)、4(定义时赋值)、44(实例初始化块内赋值)、444()构造方法内赋值