1.在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?

用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。

Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。

案例:

Class c = Class.forName(“A”);factory = (AInterface)c.newInstance();

其中AInterface是A的接口,如果下面这样写,你可能会理解:

String className = “A”;Class c = Class.forName(className);factory = (AInterface)c.newInstance();

进一步,如果下面写,你可能会理解:

String className = readfromXMlConfig;//从xml 配置文件中获得字符串Class c = Class.forName(className);factory = (AInterface)c.newInstance();

上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C , D….等,只要他们继承Ainterface就可以。

从jvm的角度看,我们使用new的时候,这个要new的类可以没有加载;

但是使用newInstance时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forName()方法,这个静态方法调用了启动类加载器(就是加载javaAPI的那个加载器)。

有了上面jvm上的理解,那么我们可以这样说,newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。

这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。

[补充:]

newInstance: 弱类型。低效率。只能调用无参构造。

new: 强类型。相对高效。能调用任何public构造。

newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。

里面就是通过这个类的默认构造函数构建了一个对象,如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数的权限就抛出IllegalAccessException

public interface duang {

public String getClazzName();

}

public class classA implements duang{

@Override

public String getClazzName() {

return "A类"+this.getClass().getName();

}

}

public class classD {

public static void main(String[] args)

{

//        System.out.println(classA.getClazzName());

try {

Class clazz = Class.forName("classA");

duang duang = (duang) clazz.newInstance();

System.out.println(duang.getClazzName());

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

//通过反射获取该类的实例化对象,并由接口来调用该类的方法

这样实现的好处就是如果也有一个classB类实现了这个接口的方法。

public class classB implements duang{

@Override

public String getClazzName() {

return "B类"+this.getClass().getName();

}

}

直接把

Class clazz = Class.forName("classA");

换成

Class clazz = Class.forName("classB");

反射的各种应用:参考这个链接

java 反射 new区别_JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)...相关推荐

  1. java list set map的区别_Java集合类List/Set/Map的区别和联系

    Java集合类List/Set/Map的区别和联系 一.Array , Arrays Java所有"存储及随机访问一连串对象"的做法,array是最有效率的一种. 1. 效率高,但 ...

  2. java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用

    Java中ListIterator和Iterator详解与辨析 在使用java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.Arra ...

  3. java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析

    本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { ...

  4. java 8 什么软件_Java 8你了解多少呢?Java之被人遗忘的Java 8的八个功能

    一直以来,多线程代码是服务器开发人员的毒药(问问Oracle的Java语言架构师和并行开发大师Brian Goetz).Java的核心库不断加入各种复杂的用法来减少访问共享资源时的线程等待时间.其中之 ...

  5. java程序员电影_Java程序员必看电影:Java 4-ever

    (Scene: A father and his son playing "throw-and-catch") (场景: 一位父亲和儿子玩丢接球游戏) Narrator: They ...

  6. java instanceof 区别_Java 中 instanceof 和 isInstance 的区别

    今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想.大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别. 本来想快点搜一下看个结论,不料还 ...

  7. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  8. java堆和客栈_java中堆和栈的区别分析

    堆和栈是java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  9. Java中string与String区别_JAVA中String与StringBuffer的区别

    JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...

最新文章

  1. 根据搜索来路 弹出相应广告
  2. 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...
  3. ADO.NET五大对象详解
  4. aspx ttf文件加载不出来_加载页面信息,刷不出来心态都崩了
  5. 【SpringMVC】SpringMVC系列4之@RequestParam 映射请求参数值
  6. Robotium_断言方法assert、is、search
  7. 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架(作业:TensorFlow教程+数字手势预测)
  8. 程序员思维是什么?程序员思维从哪里来?程序员思维到哪里去?
  9. 如何导出树结构清晰的代码机构目录
  10. RazorSQL for Mac:查看和编辑二进制数据和图像
  11. 回顾RHCE——邮件收发实验
  12. 全面:Realtek/瑞昱无线产品图谱及市场构成
  13. android 日历折叠,可折叠的日历控件Calendar
  14. Matlab入门:界面认识
  15. VS2019使用Mini-Filter
  16. VOC数据集简介与制作
  17. HL340(usb转串口线)驱动
  18. 差影-Variation Model
  19. Thinkpad预装win10硬盘分区
  20. 5.内网渗透之PTHPTTPTK

热门文章

  1. qt5.5 静态编译 mysql_QT5.3.2+mingw静态编译(生成exe大约14M)
  2. php5.5 mysql网站空间_PHP环境配置IIS5.0+PHP5.23+MYSQL5+phpMyAdmin
  3. laravel 5.8 guzzle get 参数_Laravel速查表 Cache Cookie Request
  4. pythonpostapi_python post接口测试第一个用例日记
  5. Linux读写锁释放,Linux读写锁的使用
  6. linux查看无线网卡频率,查看无线网卡工作模式
  7. 原生js动态为table追加html,JS动态添加Table的TR,TD实现方法
  8. Python高级数据类型模块collections
  9. 五种方法实现python3-随机生成10位包含数字和字母的密码
  10. python中的捕获异常、异常跟踪