java中类初始化的时机_java类初始化时机

Java类初始化时机:

静态方法(构造器隐式是静态的)的首次引用

非常数静态域的首次引用。

从以下例子中可以看出:

import java.util.*;

class Initable {

static final int staticFinal = 47;

static final int staticFinal2 =

ClassInitialization.rand.nextInt(1000);

static {

System.out.println("Initializing Initable");

}

}

class Initable2 {

static int staticNonFinal = 147;

static {

System.out.println("Initializing Initable2");

}

}

class Initable3 {

static int staticNonFinal = 74;

static {

System.out.println("Initializing Initable3");

}

}

public class ClassInitialization {

public static Random rand = new Random(47);

public static void main(String[] args) throws Exception {

Class initable = Initable.class;

System.out.println("After creating Initable ref");

// Does not trigger initialization:

System.out.println(Initable.staticFinal);

// Does trigger initialization:

System.out.println(Initable.staticFinal2);

// Does trigger initialization:

System.out.println(Initable2.staticNonFinal);

Class initable3 = Class.forName("Initable3");

System.out.println("After creating Initable3 ref");

System.out.println(Initable3.staticNonFinal);

}

} /* Output:

After creating Initable ref

47

Initializing Initable

258

Initializing Initable2

147

Initializing Initable3

After creating Initable3 ref

74

*///:~

初始化有效地实现了尽可能的“惰性”。从对initable引用的创建中可以看到,仅使用.class语法来获得对类的引用不会引发初始化。但是,为了产生Class引用,Class.forName()立即就进行了初始化。

如果一个static final值是编译器常量,就像Initable.staticFinal那样,那么这个值不需要对Initable类进行初始化就可以被读取。但是如果只是将一个域设置为static和final的,还不足以确保这种种行为,例如,对Initable.staticFinal2的访问将进行类的初始化,因为它不是一个编译器常量。

如果一个static域不是final的,那么在对它访问时,总是要求在它被读取之前,要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间),就像在对Initable2.staticNonFinal的访问中所看到的那样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值