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

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类型的域只有在其初始化表达式是常量表达式时才是常量

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值