黑马程序员技术交流社区

标题: 为什么类不用new也能实例化? [打印本页]

作者: 严明    时间: 2012-6-25 17:47
标题: 为什么类不用new也能实例化?
今天老师要求做个飞机大战的小程序,上网搜了一下,找到一些源代码,其中有一段这样的,我简写一下:
package com.test;
class FlyDemo
{
        static
        {
                System.out.println("Hello,FlyDemo");
        }
}

public class Test
{
       publicstatic void main(String[] args) throws Exception
       {
                  
ClassLoader loader =ClassLoader.getSystemClassLoader();
                  Class<?> clazz = loader.loadClass("com.test.FlyDemo");  //这句有点不是很明白,好像是加载类的吧?
                  clazz= Class.forName("com.test.FlyDemo");    //这句没有new 怎么就创建对象了呢?
     }

}

我运行了一下,结果是: 创建对象不是应该new 一下的吗?

Hello,FlyDemo


















作者: 党传才    时间: 2012-6-25 18:09
clazz= Class.forName("com.test.FlyDemo"); 这个语句是用反射的方式直接得到文件的字节码,等你看过反射的视频就懂了,就是这样创建的
作者: 李海晓    时间: 2012-6-25 18:18
clazz= Class.forName("com.test.FlyDemo");只是加载这个类,并没有实例化,
但是这个被加载的类有静态代码块所以打印出Hello,FlyDemo,
实例化可以 FlyDemo flyDemo =(FlyDemo)Class.forName("com.test.FlyDemo").newInstance(); 等同于
FlyDemo flyDemo=new FlyDemo();
作者: 陈淑飞    时间: 2012-6-25 18:58
    publicstatic void main(String[] args) throws Exception
       {
                  
ClassLoader loader =ClassLoader.getSystemClassLoader();
                  Class<?> clazz = loader.loadClass("com.test.FlyDemo");  //这句有点不是很明白,好像是加载类的吧?
                  clazz= Class.forName("com.test.FlyDemo");    //这句没有new 怎么就创建对象了呢?
     }
楼主:
1. FlyDemo 类中的打印的 Hello,FlyDemo,是类中静态代码块,他是优先于对象创建时,先被执行到的代码块。
ClassLoader的loadClass方法,是装配类的意思,具体可以参考下API中, ClassLoader的方法,我写简单点
loadClass方法方法干了些什么
  简单我们先了解下: Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化。这个步骤是严格按顺利进行的。
  也就是说 没有链接,就不会进行初始化这个步骤。
那么ClassLoader的loadClass方法 干嘛了呢,他会在内部调用 ClassLoader.loadClass(className,false); 方法去干活,第二个参数会默认传个false进去,
false代表对象被装载后不进行链接,这就意味这不会去执行该类静态块中间的内容。

那么我们就 明确了 Class<?> clazz = loader.loadClass("com.test.FlyDemo");  不会初始化 静态块的代码,此这语执行后不会去 打印出Hello,FlyDemo。

二、Class.forName("xxxx")又干嘛了呢,它会把活 交给Class.forName(className,true,classloader); 来干。
注意,第二个参数中是 true呢,它表示是在loadClass后必须进行 链接 初始化。
所以会在这个位置去,调用初始化这个静态的代码块。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2