wasw100's Blog
上一篇: 下一篇:
2009年12月27日

java中static块执行的时间

先放一个引用:http://www.javaeye.com/topic/11003

引用

其实我想事实是这样的:
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。

有上面的引用可知,static块在类加载的时候执行,但是什么时候类加载? 首先明确不是在类加载的时候执行,可以像写jdbc的时候:

Class.forName(“com.mysql.jdbc.Driver”);

这样就会加载并初始化程序,但不实例化,具体可以参考:

http://tech.it168.com/j/d/2007-01-09/200701091303176.shtml

jdbc只需加载并初始化,无需实例化。

在javaApi中有:

newInstance 实例化

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。

可见初始化可以在Class.forName(第二个参数为true)的时候进行,或者在第一次实例化的时候,如果没有初始化先初始化。

–EOF–

返回顶部