购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱08
无风起浪
——初始化静态成员时产生的陷阱

1.陷阱产生的场景

静态成员在应用程序开发中经常会用到,在类成员的类型或者方法返回值类型的前面加上关键字static,就能将该成员定义为静态成员,静态成员属于类而不属于实例。静态成员的应用范围很广泛,比如,可在应用程序的全局内获取或设置公共的静态成员的值,这类似于C++的全局变量,但如果应用不当,会给应用程序带来很多麻烦。

例4.8 初始化静态成员时产生的陷阱(光盘位置:光盘\MR\Instance\4\08\ InitStatic Member),该实例的主要分析过程如下。

在本实例中定义一个名称为Test的类,该类要实现的功能是,当使用无参的构造器实例化该类时,调用该类的GetName方法获取类内私有字段的默认值;当使用有参的构造器实例化该类时,调用该类的GetName方法获取构造器传入的参数值,具体代码如下:

注意

上面代码中的strStaticName字段是静态的。

本实例创建的是一个控制台应用程序,在Main方法中创建了两个Test类的实例,一个使用无参构造器实例化,另一个使用有参构造器实例化,具体代码如下:

按照最初的设计思路,程序的运行结果应该是t1实例调用GetName方法的返回值为东方;t2实例调用GetName方法的返回值为默认的值明日,但结果却完全出乎人的意料,运行结果如图4.13所示。

图4.13 运行结果

2.陷阱的分析

从上面运行结果可以看出,程序的运行结果并不像设计时所想的那样,而是得到了完全相同的名称。接下来在Test类中设置断点来查看程序的运行情况,当创建t1实例时,程序在Test类中的执行过程如图4.14所示。

当创建t2实例时,程序在Test类中的执行过程如图4.15所示。

图4.14 创建t1实例时的执行过程

图4.15 创建t2实例时的执行过程

从图4.14和图4.15中可以看出,静态成员变量strStaticName在类的两次实例化过程中只被初始化一次。也就是说,第二次实例化Test类时,静态成员变量strStaticName仍然保留第一次实例化Test类时的值,这就是问题的所在。所以在设计程序时,不要乱用静态成员,否则会适得其反。

说明

通过上面的分析,得出这样的结论,在一个应用程序中,无论创建了一个类的多少个实例,该类的静态字段都只被初始化一次。

3.陷阱的解决方法

本实例产生的陷阱,并不是什么系统错误或程序异常,而是对静态概念认识不够所造成的,相信很多有经验的程序员也犯过类似的错误。本实例的解决办法有很多,这里列出以下3种比较简单的解决方法。

❏ 取消静态关键字static。

❏ 当创建Test类的对象时,都使用有参的构造器。

❏ 在无参构造器中,给静态字段strStaticName赋值,代码如下: 2T/6DGBqIjfTDMO+mEruSNlgJxQOnX/RZLYuxN5MoYm1GHB1epo11zAN4/sgBPNN

点击中间区域
呼出菜单
上一章
目录
下一章
×