黑马程序员技术交流社区

标题: newInstance()方法和new关键字 [打印本页]

作者: 浩临天下    时间: 2013-6-21 20:13
标题: newInstance()方法和new关键字
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?
作者: 蚂蚁搬家    时间: 2013-6-21 21:29
newInstance方法是反射里用的,在反射里,可以通过类的字节码调用newInstance方法创建实例对象,比如,
Student.class.newInstance();
也可以通过Constructor.newInstance()创建实例对象,比如,
Constructor const = Student.class.getConstructor(Student.class);     //获取Student类的构造方法的字节码;
const.newInstance(Object ... args);
前面的方法只能调用无参构造方法来创建对象,后一种可以调用有参构造方法创建对象;

new关键字通过new 类名来创建实例对象;
new Student();
作者: x.love    时间: 2013-6-21 22:25
newInstance一般用于单例设计模式,即一个类只能创建一个对象,源码中写得这个方法名。自己设计也可以改成其他。而new则是在条件满足的情况下随意创建对象
作者: 张承富    时间: 2013-6-22 09:35
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。


从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。
现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。




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