^_^散分了~~顺便纠正一个容易犯的小错误^_^
静态块里的代码不一定是第一次被加载时执行,
确切的说应该是第一次实例化的时候执行~
因为他的执行和类的加载方式有关:
看看下面的:
1,测试类:
package com.daniel.test;
public class TestStatic {
static{
System.out.println( "执行静态块! ");
}
public void print(){
System.out.println( "执行TestStatic.print()! ");
}
}
2,主类:
package com.daniel.test;
public class StaticTest {
public static void main(String[] args) throws Exception {
StaticTest st = new StaticTest();
System.out.println( "准备加载com.daniel.test.TestStatic... ");
Class clazz = st.getClass().getClassLoader().loadClass( "com.daniel.test.TestStatic ");
System.out.println( "加载com.daniel.test.TestStatic成功! ");
System.out.println( "准备实例化com.daniel.test.TestStatic... ");
TestStatic ts = (TestStatic)clazz.newInstance();
System.out.println( "实例化com.daniel.test.TestStatic成功! ");
ts.print();
}
}
3,执行结果:
准备加载com.daniel.test.TestStatic...
加载com.daniel.test.TestStatic成功!
准备实例化com.daniel.test.TestStatic...
执行静态块!
实例化com.daniel.test.TestStatic成功!
执行TestStatic.print()!
从结果很明显看出:
静态块的执行是类第一次实例化的时候进行的~~~~~
而 不是 大家常说的第一次加载类的时候执行的!!!!!
------解决方案--------------------此加载非彼加载...
------解决方案--------------------没看明白,冲着分来的
看似楼上的明白呀
------解决方案--------------------实例化跟加载功能上一样吧
别钻牛角尖
------解决方案--------------------lz的理解是对的
------解决方案--------------------支持楼主!
帮楼主找到了一个理论依据:在 Java Language Specification 中找到这样一句“Any static initializers declared in a class are executed when the class is initialized”,也就是说,并不是在“加载(loadClass)”的时候,而是在“initialized”的时候。
至于什么时候是“initialized”,也不难找到,用如下代码就能清楚地看到了:
static{
System.out.println( "执行静态块! ");
Throwable t = new Throwable();
t.printStackTrace();
}
------解决方案--------------------实例化跟加载功能上并不一样,虽然大多数的Java虚拟机采用的lazy loading的方式,也就是当一个类第一次需要被实例化的时候才会从磁盘读取byte code加载类,不过这不是必然,有时候为了特殊原因,比如加密或者完整性检查,可以先加载所有用到的类,然后慢慢实例化,或者Java虚拟机直接就这么做了。楼主共享的经验,不顶是不行的。
------解决方案--------------------接分
------解决方案--------------------JF
------解决方案--------------------jf
------解决方案--------------------mark!
------解决方案--------------------学习
------解决方案--------------------jf 学习
------解决方案--------------------