当前位置: 首页 > news >正文

newInstance() 和 new 有什么区别?

在初始化一个类,生成一个实例的时候;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

相关文章:

  • Oracle工具的探索之旅(四)
  • AJAX 局部刷新 GridView 进行数据绑定
  • Ubuntu高仿MAC界面
  • javascript/dom:获取CSS值/getComputedStyle方法
  • ssh_ch06:hibernate外键对应设置
  • [翻译]NUnit---String Collection File Directory Assert (七)
  • DataTable对象重组时,错误提示“该行已经属于另一个表”
  • hdu 2516博弈找规律
  • SQL查询:主从表 报表方式显示
  • Linux图形界面中客户端、服务器、窗口管理器之间的关系
  • paste命令
  • 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...
  • Winform开发框架之混合型框架的剖析
  • 折腾13年——Leo张大志小传
  • 《C++.GUI.Programming.with.Qt.4》读书笔记Chapter 1~2
  • 2017-08-04 前端日报
  • Angularjs之国际化
  • Iterator 和 for...of 循环
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript异步流程控制的前世今生
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Node项目之评分系统(二)- 数据库设计
  • Promise面试题2实现异步串行执行
  • React-Native - 收藏集 - 掘金
  • Redis 懒删除(lazy free)简史
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • v-if和v-for连用出现的问题
  • Webpack 4x 之路 ( 四 )
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识 beanstalkd
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 如何优雅地使用 Sublime Text
  • 由插件封装引出的一丢丢思考
  • 正则表达式小结
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #QT项目实战(天气预报)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (a /b)*c的值
  • (附源码)php新闻发布平台 毕业设计 141646
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET的微型Web框架 Nancy
  • .NET序列化 serializable,反序列化
  • @Import注解详解
  • @RequestMapping 的作用是什么?
  • [2669]2-2 Time类的定义
  • [Android]Android开发入门之HelloWorld
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [Codeforces1137D]Cooperative Game
  • [FFmpeg学习]从视频中获取图片
  • [flask]http请求//获取请求头信息+客户端信息