Java 类内字段的初始化过程

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()构造方法内赋值




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值