本文所说的静态块是static{}
下面来探讨一下java中的静态块到底是什么时候被调用的。
可能有的人会毫不犹豫的说:“静态块是类被载入时候被调用的,并且只调用这一次!”。
很多书上也是这么写的,这句话可能不能被全部否定,但至少是不准确。
我们先做2个实验。
实验1:
class Intance
{
static{
System.out.println("静态块被调用!");
}
}
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Test test = new Test();
System.out.println("类准备装载!");
Class initclass= Class.forName("Intance", false, test.getClass().getClassLoader());
System.out.println("类装载完成!");
System.out.println("类准备实例化!");
Intance intance = (Intance)initclass.newInstance();
System.out.println("类实例化完成!");
}
}
程序运行结果:
类准备装载!
类装载完成!
类准备实例化!
静态块被调用!
类实例化完成!
实验结果很明显,这里的静态块是在类实例化的时候被调用的。
实验2:
class Intance
{
static{
System.out.println("静态块被调用!");
}
}
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Test test = new Test();
System.out.println("类准备装载!");
Class initclass= Class.forName("Intance", true, test.getClass().getClassLoader());
System.out.println("类装载完成!");
System.out.println("类准备实例化!");
Intance intance = (Intance)initclass.newInstance();
System.out.println("类实例化完成!");
}
}
程序运行结果:
类准备装载!
静态块被调用!
类装载完成!
类准备实例化!
类实例化完成!
然而将代码中
Class initclass= Class.forName("Intance", true, test.getClass().getClassLoader());
第二个参数的false改为true,静态块顺利的在类装载时候被调用了。
而我们通常情况下所用的实例化方式是:
Intance instance = new Intance();
和
Class.forName(String className);
方式等同于
Class.forName(String name, true,ClassLoader loader);
“静态块是类被载入时候被调用的,并且只调用这一次!”这句话是不完全准确的。
应该分为2中情况来说。