API中介绍的Class.forName("A") is equivalent to:Class.forName("A",true,classloader)。面第二个参数:
initialize:whether the class must be initialized。因此这里应该是实例化A的。可网上有的说,Class.forName("A")只是加载A并调用A中的static block,并没有实例化A,请问哪种说法对?我写了一个例子:class A {
static {
System.out.println("A");
}

public void test(){
System.out.println("test in A");
}
}如果Classic.forName("A",false,A.class.getClassLoader())是不执行A的static block的,若为true则打印出A。
Class.forName("A").newInstance()只打印出一个A,而A.class.newInstance()也打印出一个A。因此我认为newInstance()在实例化前判断该类有没有initialized,若无则返回一个实例,api是这么说的:The class is initialized if it has not already been initialized. 若已经实例化则newInstance()不做任何事。Am I right ,please ?

解决方案 »

  1.   

    Class.forName实例化的是一个Class的对象,这样ClassLoader就知道类型信息,在实例化该对象时静态块被执行是正常的,要实例化类对象本身,还得需要它的构造方法。SUN有篇文章专门介绍了ClassLoader的工作原理,其中就介绍到forClass方法,你找找看。
      

  2.   


    还需要实例化Class对象? 我来找找看
      

  3.   

    可网上有的说,Class.forName("A")只是加载A并调用A中的static block,并没有实例化A,这种说法是对的实例化,我们一般认为是new出一个对象,产出对应class的一个对象Class.forName("A")并不会产出A类的对象,但他却是会去执行static block,这个过程叫 初始化 ,not 实例化在jdbc中,Class.forName的那个类里就有static block,里面一般都会有DriverManager.register...之类的方法调用以注册jdbc驱动
      

  4.   

    forName("ClassName")只是把名字为ClassName的这个类的内容加载到虚拟机里,并没有创建这个类的实例对象
      

  5.   

    请楼主理解class initialized的含义。如3F所言,类的初始化是指static {
      // DO SOMETHING
    }
    // OR
    public static X x = initX();这个叫做类的初始化<clinit>,而newInstance或者直接new,叫做实例化<init>
      

  6.   

    Class.forname()只是进行初始化,返回一个Class对象的引用,没有进行实例化,实例化是new或者调用Class对象的newInstance方法
      

  7.   

    5F正确
    cinit和init,要分清
      

  8.   

    想要相关语言的所有资料吗?那就快来吧。
    我的压缩包里面不止一两样东西哦,那可是我学习和工作的所有资料,不管是学习还是工作都会需要。
    http://download.csdn.net/user/yangtonghai
      

  9.   


    正解。关键是你要知道static block是什么时候执行的,这个静态代码块是在类被加载的时候执行的,而且只执行一次。
      

  10.   

    forName("ClassName")只是把名字为ClassName的这个类的内容加载到虚拟机里,并没有创建这个类的实例对象
    正解
      

  11.   

    呵呵,最近好忙,没来得及上csdn,多谢大家!