一般情况下,如果有些代码必须在项目启动的时候就要被执行,这种情况上就需要使用静态代码块,这种代码是主动执行的,写个例子看看static块什么时候被执行
1.StaticTest
- packagecom.test.statictest;
- publicclassStaticTest{
- /**构造方法*/
- publicStaticTest(){
- System.out.println("构造函数被执行了!");
- }
- /**静态代码快*/
- static{
- System.out.println("静态代码块被执行了!");
- //show();
- }
- /**静态方法*/
- publicstaticvoidshow(){
- System.out.println("静态方法被执行了!");
- }
- }
2.Main
- packagecom.test.statictest;
- publicclassMain{
- publicstaticvoidmain(String[]args)throwsClassNotFoundException{
- Mainmain=newMain();
- //加载类
- Class.forName("com.test.statictest.StaticTest");
- Class.forName("com.test.statictest.StaticTest");
- }
- }
结果输出
静态代码块被执行了!
在测试类里我加载了2次StaticTest类,按理说"静态代码块被执行了!"这句话应执行二次,但只输出了一次。
再看看别的
- packagecom.test.statictest;
- publicclassMain{
- publicstaticvoidmain(String[]args)throwsClassNotFoundException{
- Mainmain=newMain();
- //加载类
- Class.forName("com.test.statictest.StaticTest",true,Main.class.getClassLoader());
- //Class.forName("com.test.statictest.StaticTest");
- }
- }
结果:
静态代码块被执行了!
这两个语句是等价的,执行的结果相同。
把Class.forName("com.test.statictest.StaticTest",true,Main.class.getClassLoader())中的true改为false,代表加载类的时候不初始化静态代码块的内容,只能在这个类被实例化的时候才能初始化
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码块.
我们只是想加载这个驱动到JVM,并不需要实例化这个驱动,因此调用Class.forName(xxx.xxx.xx) 足够,如果你调用Class.forName(xxx.xxx.xxx).newInstance(),结果和调用Class.forName(xxx.xxx.xxx)是一样的,因为Class.forName(xxx.xxx.xxx).newInstance() 会首先加载驱动并创建实例,但是这个实例通常你决不会用到,所有你不需要创建它。
在一个类中有一段这样的代码
class ...
{
static
{
.......
........
........
}
}
也就是静态代码块,静态代码块在什么时候执行,哪位高手给我详细一点解释一下
在这个类第一次被调用或实例化的时候就会被执行。 静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。