用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
时间: 2024-10-25 02:19:16

用newInstance与用new是区别的的相关文章

newinstance()和new有什么区别?

在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别?用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩.可扩展,可重用等软件思想上解释了.Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案.例如:Class c = Class.forName(“A”);factory = (AInterface)c.newIns

[转]newinstance()和new的区别

在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别?    用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩.可扩展,可重用等软件思想上解释了.Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案.    例如: Class c = Class.forName(“A”); factory = (AInterfac

newInstance()和new的区别

在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别?用newInstance与用new是有区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩.可扩展,可重用等软件思想上解释了.Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案.例如:Class c = Class.forName(“A”); factory = (AInterface)c.newI

JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出.语法:<![CDATA[ 内容 ]]> <![CDATA[ <book> <br/> </book> ]]> 2.处理指令处理指令,简称PI (processing instruction).处理指令用来指挥解析引擎如何解析XML文

支持中英文和国旗的android国家代码/国际电话区号选择器

最近在做app登录的时候,因为需要支持国外手机号注册和登录,所以就涉及到国际电话区号的选择.在github上面找了一下,国家名称基本都是只有英文版本,而手动的去把中文一个个加上实在是一件费时费力的事情,所以就写了一段简单的java代码,抓取了某快递网站的数据转换成json格式,以下是处理后的数据 [ { "en": "Angola", "zh": "安哥拉", "locale": "AO"

Android 轻松实现仿淘宝地区选择

代码地址如下:<br>http://www.demodashi.com/demo/11122.html 一.准备工作 Android开发环境,学习Android的童鞋肯定都知道了,这里我就不累述了. 二.运行效果 说了效果可能不太直观,下面上两张图看看效果淘宝地区选择效果 再来一张自己的效果 gif的效果可能不太好,大家自己用Android手机打开淘宝看看 三.项目结构 四.程序实现 展示很简单,ListView就可以了.对于动画效果,只需要在getView的时候获取到要展示的View,通过属

EVT_NC_PAINT 窗口非客户区的绘制

说明 NC就是non client意思,非客户区主要包括标题栏,状态栏,工具栏和边框等区域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一个非客户区的事件,在MFC中,还有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要关联这些事件,就必须要过滤该事件,或者在源码中实现该类事件 目前需要拖动边框的时候,客户区域不变,只是边框变大,等到边框拖动到合适的地方,鼠标弹起,客户区域重绘

HTML:图片热点 网页划区 表单

图片热点: 划出图片中的区域,做超链接,点击该区域就可以直接跳转到链接网站 <img src="../../../3.jpg" title="血精灵" usemap="jingling" /> <map name="jingling"> <area shape="rect" coords="52,217,288,395" href="http://

知问前端——创建header区

创建界面 我们首先要设计一个header,这个区域将要设计成永远置顶.也就是,往下拉出滚动条也永远在页面最上层可视区内.在header区,目前先设计LOGO.搜索框.按钮.注册和登录即可. 项目的大致骨架如下: index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>知问前端</title> <script type=&q