A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 浩临天下 中级黑马   /  2013-6-21 20:13  /  1263 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

3 个回复

倒序浏览
newInstance方法是反射里用的,在反射里,可以通过类的字节码调用newInstance方法创建实例对象,比如,
Student.class.newInstance();
也可以通过Constructor.newInstance()创建实例对象,比如,
Constructor const = Student.class.getConstructor(Student.class);     //获取Student类的构造方法的字节码;
const.newInstance(Object ... args);
前面的方法只能调用无参构造方法来创建对象,后一种可以调用有参构造方法创建对象;

new关键字通过new 类名来创建实例对象;
new Student();

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
newInstance一般用于单例设计模式,即一个类只能创建一个对象,源码中写得这个方法名。自己设计也可以改成其他。而new则是在条件满足的情况下随意创建对象

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。


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

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马