因为楼主写的那句话会导致你那个类的初始化。
只有在首次主动使用的时候会导致类的初始化。
主动使用的几种情况:
1:创建类的实例,例如:new XX();
2:访问某个类或者接口的静态变量,或者对该静态变量赋值;
3:调用类的静态方法
4:反射,例如:Class.forName("XX");
5:初始化一个类的子类
6:Java虚拟机其董事会被标注为启动的类,例如:java XX
楼主说的情况,应该是满足上面所说的第四条了。

解决方案 »

  1.   

    LZ,
    你classA 这个类声明了这个静态块,当累初始化的时候,就会加载。
    当classB,直接Class.forName("A");的时候,系统会加载发射生成A,所以直接初始化,打印出了aaaa
      

  2.   

    在B类中执行Class.forName(A);时候,jvm会用ClassLoader自动加载A这个类,直接初始化A类,建议看看关于jvm的类加载的知识,有助于对java深一步的理解
      

  3.   


    类中的代码块,分成静态的和非静态的。静态代码块是属于类的,而非静态是属于实例化对象的。
    使用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");
        }
    }
      

  4.   

    楼上说的都很好的,我也说一下吧,是这样子的:
    反射LZ懂吧,Java中,当你编译成.class 字节码时,即Java的Class对象(JVM)是自动帮你生成的,其中这个过程中,它load Class对象,并将它初始化(如果有static block则执行),它是优先与main执行的。
      

  5.   

    请教一下.调用了 类名.Class,静态代码没有执行,newInstance的时候静态代码才执行.那么这个时候类到底加载了没有呢?  如果说加载了,那么静态代码的初始化和类的加载应该是分开的了?