因为楼主写的那句话会导致你那个类的初始化。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的子类
6:Java虚拟机其董事会被标注为启动的类,例如:java XX
楼主说的情况,应该是满足上面所说的第四条了。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的子类
6:Java虚拟机其董事会被标注为启动的类,例如:java XX
楼主说的情况,应该是满足上面所说的第四条了。
你classA 这个类声明了这个静态块,当累初始化的时候,就会加载。
当classB,直接Class.forName("A");的时候,系统会加载发射生成A,所以直接初始化,打印出了aaaa
类中的代码块,分成静态的和非静态的。静态代码块是属于类的,而非静态是属于实例化对象的。
使用Class.forName("A")是加载类,所以类的静态代码块会执行。
像楼主的代码,如果把代码块的static去掉,那么代码就不会执行了。
如果要执行非静态代码块,那么需要把加载的类实例化:Class.forName("A").newInstance()
如下面代码所示。 public static void main(String[] args) throws Exception {
Class c = Class.forName("com.jscai.test.A"); // 加载类,执行静态代码块
c.newInstance(); // 实例化对象,执行非静态代码块
}
class A {
{ // 非静态代码块
System.out.println("instance");
}
static { // 静态代码块
System.out.println("static");
}
}
反射LZ懂吧,Java中,当你编译成.class 字节码时,即Java的Class对象(JVM)是自动帮你生成的,其中这个过程中,它load Class对象,并将它初始化(如果有static block则执行),它是优先与main执行的。