- 1、本文档共49页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Thinking
in
Java
Fourth Edition
Bruce Eckel
初始化和清理
随着计算机革命的演进,不安全的程序设计方式已经是程序昂贵的罪魁祸
首。
初始化和清理问题便是这类不安全问题中的两个。 许多C语言程序的bugs就是因为程序员忘记
了初始化一个变量。 当使用library component的用户不知道该如何初始化或者他们必须初始化
library component时,初始化的问题表现的尤为明显。 清理工作之所以是一个特别的问题就是因
为当你用完某个代码元素后,它就不再引起你的注意了,你就容易忘记使用过它。 结果是代码元素
占用的资源未被清理,你就容易耗尽资源,最明显的就是内存。
C++引入了constructor的概念,它是一类当对象创建时自动被调用的方法。 Java也采用了
constructor,而且Java拥有garbage collector,garbage collector在内存资源不再被使用时自动
释放那些资源。 这一章阐述了初始化和清理问题以及Java如何配合他们的。
使用constructor保证初始化
想象一下你为每一个你写的类都创建了一个称为initialize( )的方法。 这个方法的名字暗示
着在使用类的对象前都应该调用此方法。 不幸的是,这就意味着类的使用者必须记住要调用那个方
法。 而在Java里,类的设计者能够通过提供constructor确保每个创建的对象都初始化。 如果一个
类定义拥有一个constructor,那么在类的使用者进一步操纵类之前,Java就会在该类的对象被创建
的时候调用那个constructor。 因此初始化得到了保证。
接下来的难题是该为constructor方法起个什么样的名字。 有两个问题需要解决。 第一个问题
是你使用的任何名称都有可能与类成员的名称冲突。 第二个问题是编译器必须一直知道哪一个方法
被用做constructor来调用,因为编译器负责调用constructor。 C++的解决方案似乎最简单也最富
逻辑性,因此这种解决方案也在Java里被采用。 也就是constructor的名字和对应类的名字保持相
同。 采用这样的解决方案很有意义,因为它使得初始化的时候constructor将被自动调用。
以下是一个含有constructor的简单的类:
//: initialization/SimpleConstructor.java
// Demonstration of a simple constructor.
class Rock {
Rock() { // This is the constructor
System.out.print(Rock );
}
}
public class SimpleConstructor {
public static void main(String[] args) {
for(int i = 0; i 10; i++)
new Rock();
}
} /* Output:
Rock Rock Rock Rock Rock Rock Rock Rock Rock Rock
*///:~
现在,当对象被创建的时候:
new Rock();
内存被分配给对象,然后constructor被自动调用。 这样就确保了你在进一步操纵对象之前对
象被适当地初始化。
注意,方法名称的第一个字母是小写的代码编写风格并不适用于constructor,因为constructor
的名字必须和类的名字完全匹配。
没有参数的constructor被称为default constructor。 Java文档对default constructor的特
色称呼是 no-arg constructor,但是在Java问世以前,“default constructor”的叫法已经使用
了很多年,所以我倾向于使用后者。 像一般的方法一样,constructor也可以拥有参数,以便允许
你指定对象如何创建。 前面的例子可以容易地改变成constructor采用一个参数的形式:
//: initialization/SimpleConstructor2.java
// Constructors
文档评论(0)