首页 > 其他分享 >newInstance() 和 new 有什么区别

newInstance() 和 new 有什么区别

时间:2023-08-29 18:36:30浏览次数:45  
标签:forName 区别 newInstance AInterface new Class 加载


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

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

// 从xml 配置文件中获得字符串

String className = readfromXMlConfig;

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


标签:forName,区别,newInstance,AInterface,new,Class,加载
From: https://blog.51cto.com/u_16240770/7278979

相关文章

  • 全角和半角字符的区别
    全角和半角字符的区别全角字符和半角字符的区别主要体现在形状和字符存储上。在全角状态下,我们输入一个字母所占的字符是两个;而在半角状态下,我们输入一个字母所占的字符只有一个。但是输入汉字两者所占的字符都是两个。全角符号是双字节中文编码的历史遗留问题。当年在纯文本的......
  • 关于Newtonsoft.Json的随笔
    在工作中一些陈旧项目,难免引用了一些很老版本,在一次升级中,项目引用的Newtonsoft.Json.dll突然少了一些method和class1,原来的:(咱也不懂为啥没有版本号嘞 2,升级后的 问题:1,原来使用的函数不存在,但是其实还在,换地方了而已,以下是修改:Newtonsoft.Json.JavaScriptConvert.Seria......
  • Spring 中 @Autowired与@Resource的区别
    1、@Autowired与@Resource都是做bean的注入时使用,都可以用来装配bean,都可以写在字段上,或写在setter方法上。  2、@Autowired默认按类型装配(这个注解属于spring),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。如:@Autowired(required=fals......
  • 软件测试的CMA和CNAS分别是什么?有什么用途和区别?
    各行各业都有不同的证书,第三方软件检测机构也需要经过考核检验以获取认可。今天我们将围绕软件测试的CMA和CNAS展开讨论,以帮助您更好地了解它们的定义、区别和用途。一、CMA软件测试:1、定义:CMA软件测试是指基于中国计量认证制度的软件测试,其目的是确保软件产品和系统满......
  • 流媒体服务器与视频服务器有什么区别?
    流媒体服务器与视频服务器有什么区别?流媒体服务器用在远程教育,视频点播、网络电台、网络视频等方面。直播过程中就需要使用流媒体服务器,一个完整的直播过程,包括采集、处理、编码、封包、推流、传输、转码、分发、解码、播放等过程,流媒体服务器主要负责采集,传输和播放等过程。流媒......
  • 软件验收测试、确认测试、鉴定测试的区别与联系
    在软件开发的过程中,验收测试、确认测试和鉴定测试是不可或缺的环节。这三种测试方法在软件质量保证中起着不同的作用,相互之间存在一定的区别和联系。一、软件验收测试软件验收测试是在软件所有的开发工作完成之后进行的一种全面性测试。它的目的是验证软件是否按照预期......
  • ArrayList源码阅读之EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA区别
    /***Sharedemptyarrayinstanceusedforemptyinstances.*/privatestaticfinalObject[]EMPTY_ELEMENTDATA={};/***Sharedemptyarrayinstanceusedfordefaultsizedemptyinstances.We*distinguishthisfromEMPTY_ELEMENTDATAtoknowhowmuchtoi......
  • 【Python-每日技巧】格式化输出的区别
    在Python中,字符串可以使用单引号(')或双引号(")括起来。如果字符串本身包含引号字符,你可以在字符串中使用反斜杠(\)进行转义。对于字符串中的美元符号($),它是一个普通的字符,不需要进行特殊处理。你可以直接在字符串中使用美元符号,如下所示:my_string="Thisisastringwitha$symbol."......
  • 深入理解操作系统中进程与线程的区别及切换机制(下)
    前言上一篇文章中我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。在本篇文章中,我将探讨研究进程的状态模型、控制结构和切换机制。希望通过这篇文章的......
  • 【Effective C++】定制new和delete
    文章目录一、了解new-handler的行为1、new和malloc的对比2、set_new_handler的使用3、new-handler设计要求4、提供自己的set_new_handler和operatornew5、请记住二、了解new和delete的合理替换时机1、替换编译器提供的operatornew或operatordelete2、请记住三、编写new和delete......