constructor

更新时间:2022-12-26 14:30:31 阅读: 评论:0


2022年12月26日发(作者:vhomework)

new和newInstance()tance()区别

1、类的加载⽅式不同

在执⾏e("")时,JVM会在classapth中去找对应的类并加载,这时JVM会执⾏该类的静态代码段。在使⽤newInstance()⽅法的时

候,必须保证这个类已经加载并且已经连接了,⽽这可以通过Class的静态⽅法forName()来完成的。

使⽤关键字new创建⼀个类的时候,这个类可以没有被加载,⼀般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。

2、所调⽤的构造⽅法不尽相同

new关键字能调⽤任何构造⽅法。

newInstance()只能调⽤⽆参构造⽅法。

3、执⾏效率不同

new关键字是强类型的,效率相对较⾼。

newInstance()是弱类型的,效率相对较低。

既然使⽤newInstance()构造对象的地⽅通过new关键字也可以创建对象,为什么⼜会使⽤newInstance()来创建对象呢?

假设定义了⼀个接⼝Door,开始的时候是⽤⽊门的,定义为⼀个类WoodenDoor,在程序⾥就要这样写Doordoor=newWoodenDoor()。假设后来⽣活条

件提⾼,换为⾃动门了,定义⼀个类AutoDoor,这时程序就要改写为Doordoor=newAutoDoor()。虽然只是改个标识符,如果这样的语句特别多,改动还是

挺⼤的。于是出现了⼯⼚模式,所有Door的实例都由DoorFactory提供,这时换⼀种门的时候,只需要把⼯⼚的⽣产模式改⼀下,还是要改⼀点代码。

⽽如果使⽤newInstance(),则可以在不改变代码的情况下,换为另外⼀种Door。具体⽅法是把Door的具体实现类的类名放到配置⽂件中,通过

newInstance()⽣成实例。这样,改变另外⼀种Door的时候,只改配置⽂件就可以了。⽰例代码如下:

StringclassName=从配置⽂件读取Door的具体实现类的类名;

Doordoor=(Door)e(className).newInstance();

再配合依赖注⼊的⽅法,就提⾼了软件的可伸缩性、可扩展性。

newInstance()的参数版本与⽆参数版本详解

通过反射创建新的类⽰例,有两种⽅式:

tance()

tance()

以下对两种调⽤⽅式给以⽐较说明:

tance()只能够调⽤⽆参的构造函数,即默认的构造函数;

tance()可以根据传⼊的参数,调⽤任意构造构造函数。

tance()抛出所有由被调⽤构造函数抛出的异常。

tance()要求被调⽤的构造函数是可见的,也即必须是public类型的;

tance()在特定的情况下,可以调⽤私有的构造函数。

ClassA(被调⽤的⽰例):

[java]

classA{

eA(){

n("A'sconstructoriscalled.");

04.}

05.

eA(inta,intb){

n("a:"+a+"b:"+b);

08.}

09.}

ClassB(调⽤者):

输⼊结果如下:

通过tance()调⽤私有构造函数:

通过tance()调⽤私有构造函数【失败】

通过tance()调⽤私有构造函数:

A'sconstructoriscalled.

a:5b:6

说明⽅法newInstanceByClassNewInstance调⽤失败,⽽⽅法newInstanceByConstructorNewInstance则调⽤成功。

如果被调⽤的类的构造函数为默认的构造函数,采⽤tance()则是⽐较好的选择,

⼀句代码就OK;如果需要调⽤类的带参构造函数、私有构造函数,

就需要采⽤tance(),两种情况视使⽤情况⽽定。

不过JavaTotorial中推荐采⽤tance()。

[java]

classB{

staticvoidmain(String[]args){

=newB();

n("通过tance()调⽤私有构造函数:");

tanceByClassNewInstance();

n("通过tance()调⽤私有构造函数:");

tanceByConstructorNewInstance();

08.}

09./*通过tance()创建新的类⽰例*/

evoidnewInstanceByClassNewInstance(){

{/*当前包名为reflect,必须使⽤全路径*/

=(A)e("reflect.A").newInstance();

13.}catch(Exceptione){

n("通过tance()调⽤私有构造函数【失败】");

15.}

16.}

17.

18./*通过tance()创建新的类⽰例*/

evoidnewInstanceByConstructorNewInstance(){

{/*可以使⽤相对路径,同⼀个包中可以不⽤带包路径*/

=e("A");

22./*以下调⽤⽆参的、私有构造函数*/

uctorc0=laredConstructor();

essible(true);

0=(A)tance();

26./*以下调⽤带参的、私有构造函数*/

uctorc1=laredConstructor(newClass[]{,});

essible(true);

1=(A)tance(newObject[]{5,6});

30.}catch(Exceptione){

tackTrace();

32.}

33.}

34.}

本文发布于:2022-12-26 14:30:31,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/34229.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:unite
下一篇:teeth
标签:constructor
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图