作者:wasw100
网址:http://www.wasw100.com/java/java_static_time.html
先放一个引用:http://www.iteye.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块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
一个类的运行,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--