当前位置: 代码迷 >> J2SE >> ^_^散分了~顺便纠正一个容易犯的小异常^_^
  详细解决方案

^_^散分了~顺便纠正一个容易犯的小异常^_^

热度:177   发布时间:2016-04-24 16:06:50.0
^_^散分了~~顺便纠正一个容易犯的小错误^_^

静态块里的代码不一定是第一次被加载时执行,
确切的说应该是第一次实例化的时候执行~

因为他的执行和类的加载方式有关:
看看下面的:
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 学习
------解决方案--------------------
  相关解决方案