在初始化一个类,生成一个实例的时候;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()方法,这个静态方法调用了启动类加载器(就是加载java API的那个加载器)。
有了上面jvm上的理解,那么我们可以这样说,newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。

[补充:]
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
里面就是通过这个类的默认构造函数构建了一个对象,如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数的权限就抛出IllegalAccessException

转载于:https://www.cnblogs.com/rowp/archive/2011/10/27/2227011.html

newInstance() 和 new 有什么区别相关推荐

  1. newinstance()和new有什么区别?

    http://www.jobui.com/mianshiti/it/java/7148/ 在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别? 用newInstan ...

  2. Class.newInstance()与new、Constructor.newInstance()的区别

    在初始化一个类,生成一个实例的时候,newInstance() 和 new 有什么区别? 用newInstance与用new是区别的, 区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会 ...

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

    1.在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别? 用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么 ...

  4. Class.forName()、Class.forName().newInstance() 、New 三者区别!

    在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态 ...

  5. (转)newInstance()和new()

    在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态 ...

  6. Class.forName( )你搞懂了吗?——转

    Class.forName( )你搞懂了吗?--转 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助.       在Java开 ...

  7. c语言dynamic变量,C# dynamic关键字的使用方法

    dynamic和var的区别: 1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字 ...

  8. JAVA帮助文档全系列

    JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运 ...

  9. Java全链路复习面经-基础篇(2.5万字全文)

    序言 主要分为两篇,一篇基础篇,涵盖Java基础,数据库,JVM,计算机网络等知识 另一篇为框架篇,主要为流行框架,如Spring.SpringMVC.Mybatis.SpringBoot.Sprin ...

  10. Android 反射

    一.什么是反射 反射,即Reflection,通常是指程序可以访问.检测和修改它本身状态或行为的一种能力. 具体说来,是在运行状态时,对于任意一个类或对象,能够知道和操作它的任意方法和属性. 需要注意 ...

最新文章

  1. mysql与oracle函数对比
  2. 企业运维之域控篇(十)--SERVER 2003 迁移到 SERVER 2008 (异机)
  3. 为什么大数据需要数据湖?
  4. 使用cloudera manager搭建HUE后的使用,包括Oozie
  5. 图解tcmalloc内存分配器
  6. ajax返回的数据怎么显示出来_Excel输入汉字、拼音首字母就能显示数据出来,录数据时逐步提示...
  7. tortoisegit 代码的回滚方式 --两种
  8. oracle怎么定位效率,oracle查询效率,该怎么解决
  9. limbo pc for android,「Limbo PC emulator」可以让安卓手机安装 Windows 10 了
  10. Github Coding Developer Book For LiuGuiLinAndroid
  11. 简述ip地址的abc类如何划分_IP地址ABC三类划分详细内容记录
  12. 示波器的使用和李萨如图形
  13. 明解C语言 入门 课后习题练习答案 第三章
  14. Tensorflow - 训练中出现 Nan 值
  15. 原来人脸识别技术是“酱紫”实现的!
  16. 吐血推荐 36招搞定电脑一切难题
  17. 爬虫实现中英文的词语和句子互译
  18. mysql如何恢复单表_MySQL如何恢复单库或单表,以及可能遇到的坑
  19. 系统集成项目管理工程师考试时间
  20. 【基金量化研究系列】基金绩效归因模型(三)——基于CAPM、T-M、H-M、C-L模型的基金绩效归因研究

热门文章

  1. 随记-Git相关操作
  2. Linux下获取时间差(毫秒级)
  3. 【ML小结8】降维与度量学习(KNN、PCA、因子分析、LDA)
  4. android studio for android learning (八)开机启动界面splashActivity
  5. tps5430应用电路详解_详解常用电阻的优缺点
  6. 20165320 我期望的师生关系
  7. 解析json对象出现$ref: $.list[0]的解决办法
  8. hadoop2.x配合ZooKeeper集群环境搭建
  9. Docker入门之运行原理及常用命令
  10. mysql之前缀索引