谈谈JAVA中的循环初始化问题

转载于:http://www.diybl.com/course/3_program/java/javajs/2008105/147468.html

初始化的顺序问题即一个对象的创建过程

1) 定位相关类的class文件

2) 载入class文件,静态(static)初始化只在class对象首次加载时进行一次,静态变量定义的先后决定了初始化的顺序

3) 当使用new创建对象时,首先在堆上为对象分配足够的内存空间

4) 这块存储空间被清零,这就将对象中的全部的基本的数据类型的数据设置为默认值(数字:0,引用设置成空),注意这里有一个例外。

5) 执行所有出现在字段定义处的初始化动作(变量定义的先后决定了初始化的顺序)

6) 执行构造方法(注意:构造方法的方法体是最后执行的)

2.static和final对于初始化的影响

静态的final变量在设置值的时候有两种可能:一种是设置为默认值,一种是设置为你给定的值,这取决于你设定的值是否是常量表达式。

例:[Java解惑]

public class Elvis {

public static final Elvis INSTANCE = new Elvis();

private final int beltSize;

private static final int CURRENT_YEAR =2008;…………………………………..1

private Elvis() {

beltSize = CURRENT_YEAR - 1930;

}

public int beltSize() {

return beltSize;

}

public static void main(String[] args) {

System.out.println("Elvis wears a size " +

INSTANCE.beltSize() + " belt.");

}

}

执行的结果是Elvis wears a size 78 belt

public class Elvis {

public static final Elvis INSTANCE = new Elvis();

private final int beltSize;

private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);……………………………………2

private Elvis() {

beltSize = CURRENT_YEAR - 1930;

}

public int beltSize() {

return beltSize;

}

public static void main(String[] args) {

System.out.println("Elvis wears a size " +

INSTANCE.beltSize() + " belt.");

}

}

执行的结果是Elvis wears a size -1930 belt

程序的不同点是:1和2两句,一个设定为常量表达式,一个没有设定为常量表达式,设定为常量表达式的,在初始化的时候,即将其设定为相关的常量,否则就将其设定为默认值

该程序表明,在final类型的静态域被初始化之前,存在着读取它的值的可能,而此时该静态域包含的还只是其所属类型的缺省值。这是与直觉相违背的,因为我们通常会将final类型的域看作是常量。final类型的域只有在其初始化表达式是常量表达式时才是常量

由类初始化中的循环所引发的问题是难以诊断的,但是一旦被诊断到,通常是很容易订正的。要想订正一个类初始化循环,需要重新对静态域的初始器进行排序,使得每一个初始器都出现在任何依赖于它的初始器之前。

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javajs/2008105/147468.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值