您的位置:首页 > 编程语言 > Java开发

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

2008-10-03 19:23 239 查看
1. 初始化的顺序问题即一个对象的创建过程
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类型的域只有在其初始化表达式是常量表达式时才是常量
由类初始化中的循环所引发的问题是难以诊断的,但是一旦被诊断到,通常是很容易订正的。要想订正一个类初始化循环,需要重新对静态域的初始器进行排序,使得每一个初始器都出现在任何依赖于它的初始器之前。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: