·首先从功能上来说:它们都是创建类的实例
New是一个关键字
NewInstance(),是一个方法
·它们的区别究竟在什么地方呢?
1、newInstance(),采用的是类加载机制,创建一个新的实例
2、New 直接创建一个实例
那为什么会有两种创建实例的方式呢?
主要是考虑到软件的可伸缩、可扩展、可重用的设计思想
注意:使用newInstance()方法时,对象身上一定要有一个默认的无参构造方法;使用类加载机制:可以很灵活的,创建类的实例,以后更换类的时候,无须修改源代码了。有人会说,调用newInstance方法的时候,不是要返回一个实例对象吗,那还不是要修改。。返回的永远都是父类,或者接口,根本不会返回子类,所以无须担心并不是原创 但是感觉很有用 拿来与大家分享
这些只是一部分 望各位补充 能够写出 更底层的 new原理 让坛子里的刚学习 更理解深入 大牛们就做复习之用吧
New是一个关键字
NewInstance(),是一个方法
·它们的区别究竟在什么地方呢?
1、newInstance(),采用的是类加载机制,创建一个新的实例
2、New 直接创建一个实例
那为什么会有两种创建实例的方式呢?
主要是考虑到软件的可伸缩、可扩展、可重用的设计思想
注意:使用newInstance()方法时,对象身上一定要有一个默认的无参构造方法;使用类加载机制:可以很灵活的,创建类的实例,以后更换类的时候,无须修改源代码了。有人会说,调用newInstance方法的时候,不是要返回一个实例对象吗,那还不是要修改。。返回的永远都是父类,或者接口,根本不会返回子类,所以无须担心并不是原创 但是感觉很有用 拿来与大家分享
这些只是一部分 望各位补充 能够写出 更底层的 new原理 让坛子里的刚学习 更理解深入 大牛们就做复习之用吧
如果是从配置中加载的,用newInstance.使用newInstance好处是不需改代码,可以随意更改实现.
其实这些 很多做过开发一年多的人 都清楚 我发这个帖子的本意 是希望大牛能够 深入剖析 new
我其实想说的 就是这块 装载-连接-初始化 new在这个过程做了这些东西
但是 能不能像 反射这样理解 我现在也对这块有点迷糊的
new的话,相对高效些。但是就跟楼主说的一样。当发生变化时不像newInstance那样无需修改源码。个人感觉newInstance在接口编程方面是不二的选择。原因就是他的优点。
new如果类没有被加载的话会加载类,而newInstance是必须发生在加载类之后,即发生在Class.forName等等之后
new是针对即知类型的类的操作,编译期会查看new后面接着的类是否存在,而newInstance在编译期并不检测类是否存在,在运行期中如果出错会抛出异常
new如果类没有被加载的话会加载类,而newInstance是必须发生在加载类之后,即发生在Class.forName等等之后
new是针对即知类型的类的操作,编译期会查看new后面接着的类是否存在,而newInstance在编译期并不检测类是否存在,在运行期中如果出错会抛出异常楼上的说很有道理 这些也是 newInstance的执行机制
这个 其实我是想 得到这个Class#newInstance调用的就是构造方法,与new无异 结果 我自己也是这样认为的 但是 不确定
所以通常为这些以后可能进行修改的类新建一个接口。让以后的具有相同的功能类都继承这个接口。
再写一个配置文件。里面存放了继承那个接口的类的名称。通过读取这个配置文件。获取相应的类名字,
最后再编写一个类。里面存放的方法都是Static方法。通过调用这些方法。返回相应类的实例。返回的类型都为接口类型。
throws Throwable {这个Object proxy
不能在这个方法里面调用 会造成 死循环 也望各位能够解惑
这个 只是 对比 new 与 newInstance的优点和 使用 这些我目前都知道这样做的
我只是 想更深入的了解 和学习 new的底层机制 其实就是头脑缺个模型图 不能像 newInstance那样清晰
LZ可以看看C++方面的一些关于操作符重载的知识
关于楼主问的“那为什么会有两种创建实例的方式呢?”我的理解是:new是创建对象的基本方式,
而Class.newInstance() 完全是为了让Class这个类的功能完善,不管你的什么类加载机制,反射机制,实际都是Class这个类的功能,我觉得可以简单地把它理解为功能,所以我觉得没必要讨论new 和 newInstance()的什么关系!而且sun的jdk source里的注释是这样开关的 /**
* Creates a new instance of the class represented by this <tt>Class</tt>
* object. The class is instantiated as if by a <code>new</code>
* expression with an empty argument list. The class is initialized if it
* has not already been initialized.
.............
*/
public T newInstance() 其中这一句“The class is instantiated as if by a <code>new</code>
expression with an empty argument list ”
说明他们做同样的事情。
可能我说的比较抽象 我觉得缺少头脑中有种模型 可能我对new 的理解比较浅
/**
* Creates a new instance of the class represented by this <tt>Class</tt>
* object. The class is instantiated as if by a <code>new</code>
* expression with an empty argument list. The class is initialized if it
* has not already been initialized.
.............
*/
public T newInstance()学习 拿走了
throws Throwable {这个Object proxy
不能在这个方法里面调用 会造成 死循环 也望各位能够解惑这个帮看下吧
也就是用:newInstance()的方法。
人家读代码,你非要猜代码。有些东西深入剖析有收获,有些纯属浪费时间,为什么sql要用select from 而不用choose in?人家就这么规定的,有什么可以再研究的?人家要工作要生活,解答问题也没有收入,为什么要陪个十万个为什么去玩?你的问题在java doc里基本可以得到全部的解答,为什么要别人帮你翻译一遍?
其实我不喜欢在论坛了 问一些实际的问题 这些问题 往往自己基础好就可以解决的 但是思想的问题 就不一样的
Class aClass = Class.forName(xxx.xx.xx);
Object anInstance = aClass.newInstance();我觉得newInstance这个方法就是用在不明确你要的对象是什么,所以才使用这个方法。
而new的话,是已经明确了你要的什么,所以可以直接创建对象。这是我的理解。
上面的话仅供玩笑。无视之。
其实讨论问题应该有一个范围,有一个范围就好讨论了。比如说,从概念上来讲,一切都是对象嘛,Class也是对象,那这个对象当然应该能创建自己的实例。再从场合上来讲,不是所有情况下都明确知道该new谁,是动态变化的。再比如说从技术实现上讲。等等等。。个人愚见,仅供参考