Java中newInstance()和new()区别
前言:
最近在看springIOC和AOP是看见代码中很实用newInstance来实例化一个对象,之前对newInstance和new实例化对象的区别很模糊,特意在这里记录一下
一、newInstance()和new()区别:
1、两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类:
2、newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过
3、newInstance: 弱类型(GC是回收对象的限制条件很低,容易被回收)、低效率、只能调用无参构造,new 强类型(GC不会自动回收,只有所有的指向对象的引用被移除是才会被回收,若对象生命周期已经结束,但引用没有被移除,经常会出现内存溢出)
二、伸缩、扩展性:
在开发中,我们经常可以看到一些接口的设计,实现接口的类加载一般都会采用newInstance而不会使用new,在这里就涉及到了两者在开发过程中的扩展性和伸缩性,来看一段代码:
定义一个BeanFactory接口,分别让类A、B实现接口:
package com.main;
public interface BeanFactory {
//核心方法getBean
Object getBean(String name);
}
public class B implements BeanFactory{
@Override
public Object getBean(String name) {
return null;
}
}
public class A implements BeanFactory{
@Override
public Object getBean(String name) {
return null;
}
}
测试结果:
public class Test { @SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception { Class a1 = Class.forName("A");
BeanFactory a2 = (BeanFactory) a1.newInstance();
System.out.println(a2); Class b1 = Class.forName("B");
BeanFactory b2 = (BeanFactory) b1.newInstance();
System.out.println(b2);
} }
A@15db9742
B@6d06d69c
通过上面实例我们可以很清楚的看到,如果在接口的设计中很多类实现了该接口,我们只需要使用Class中的forName方法加载一下类就可以了,可以将这一段代码提出来作为一个工具类方法,不管有多少类只要实现了该接口我们只要传入需要实例化的路径名就可以实例化,这样大大节省了我们的代码(注:newInstance实例化对象是只能调用无参构造方法,在A、B类中并没有构造方法,是因为每个创建的类都有一个默认的无参构造方法,如果你重写了一个带参构造方法,想要使用newInstance,则必须指定一个无参构造方法,否则会报初始化错误)
Java中newInstance()和new()区别的更多相关文章
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
- c#与java中byte字节的区别及转换方法
原文:c#与java中byte字节的区别及转换方法 在java中 byte的范围在 [-128,127] 在C#中 byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...
- java中==与equel的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...
- Java中的“&”和“&&”的区别
Java中的"&"和"&&"的区别 1."&"是位运算符,"&&"是逻辑 ...
- java中PriorityBlockingQueue 和DelayedWorkQueue 区别
java中PriorityBlockingQueue 和DelayedWorkQueue 区别
随机推荐
- 解决mac上每次升级nodejs都要重新安装扩展包的问题
虽然有了一些新生派竞品比如yarn,但使用或者习惯了npm的开发者仍然大有人在. 以前用起来没注意到这个现象,最近一段时间发现,每次随着使用brew upgrade自动升级了nodejs版本,原来安装 ...
- TypeScript 上手教程
无疑,对于大型项目来说,Vanilla Js 无法满足工程需求.早在 2016 年 Anuglar 在项目中引入 TypeScript 时,大概也是考虑到强类型约束对于大型工程的必要性,具体选型考虑可 ...
- RDIFramework.NET V3.3 Web版新增日程管理功能模块
功能描述 在RDIFramework.NET V3.3 Web版本我们新增了日程管理.基于月.周.日的日历视图,把安排到每一天的具体时间点,让每一天的时间都充分利用:甚至您也可以把个人非工作事项也安排 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——6.做一个能走路和对话的机器人
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- KVM虚拟化使用详解--技术流ken
KVM介绍 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中. KVM的虚拟化需要硬件支持 ...
- 使用seaborn探索泰坦尼克号上乘客能否获救
titanic数据集是个著名的数据集.kaggle上的titanic乘客生还率预测比赛是一个很好的入门机器学习的比赛. 数据集下载可以去https://www.kaggle.com/c/titanic ...
- .net工具类 分享一个简单的随机分红包的实现方式
废话不多说,直接上代码 /// <summary> /// 分红包 /// </summary> public class RandomMoney { public Rando ...
- [Java] 为什么字符串比较不能用两个等号(==)
Java中,使用"=="比较字符串时,判断的是两个字符串是否存放在相同的位置.如果两个字符串存放在相同的位置,那么它们就是相同的,使用"=="比较的结果也就是T ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- WPF:Webbrowser 捕获关闭事件
有点难描述说的是什么.大概就是下面这个图:窗体中嵌套一个Webbrowser,现在网页请求关闭 响应MessageHook事件: this.webBrowser.MessageHook += webB ...