如一个类class A {
static {
system.out.println("aaaaa");
}
}
另一个类中class B{
main(){//main方法,大家知道就行了
Class.forName(A);
}
}
就会打印出“aaaaa”,为什么呐?
------解决方案--------------------
因为楼主写的那句话会导致你那个类的初始化。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的子类
6:Java虚拟机其董事会被标注为启动的类,例如:java XX
楼主说的情况,应该是满足上面所说的第四条了。
------解决方案--------------------
LZ,
你classA 这个类声明了这个静态块,当累初始化的时候,就会加载。
当classB,直接Class.forName("A");的时候,系统会加载发射生成A,所以直接初始化,打印出了aaaa
------解决方案--------------------
在B类中执行Class.forName(A);时候,jvm会用ClassLoader自动加载A这个类,直接初始化A类,建议看看关于jvm的类加载的知识,有助于对java深一步的理解。。。
------解决方案--------------------
类中的代码块,分成静态的和非静态的。静态代码块是属于类的,而非静态是属于实例化对象的。
使用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执行的。
------解决方案--------------------
静态代码块 在类被加载是就会去执行