CSDN博客

img GilBert1987

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

发表于2008/10/3 19:23:00  347人阅读

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

1)        定位相关类的class文件

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

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

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

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

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

2staticfinal对于初始化的影响

静态的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

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

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

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

0 0

相关博文

我的热门文章

img
取 消
img