《java编程思想》第四版 第2 章 一切都是对象 2 . 3 绝对不要清除对象

在大多数程序设计语言中,变量的“存在时间”(Lifetime)一直是程序员需要着重考虑的问题。变量应持
续多长的时间?如果想清除它,那么何时进行?在变量存在时间上纠缠不清会造成大量的程序错误。在下面
的小节里,将阐示Java 如何帮助我们完成所有清除工作,从而极大了简化了这个问题。

2 . 3 . 1 作用域

大多数程序设计语言都提供了“作用域”(Scope)的概念。对于在作用域里定义的名字,作用域同时决定了
它的“可见性”以及“存在时间”。在C,C++和Java 里,作用域是由花括号的位置决定的。参考下面这个
例子:

{
int x = 12;
/* only x available */
{
int q = 96;
/* both x & q available */
}
/* only x available */
/* q “out of scope” */
}

作为在作用域里定义的一个变量,它只有在那个作用域结束之前才可使用。
在上面的例子中,缩进排版使Java 代码更易辨读。由于Java 是一种形式自由的语言,所以额外的空格、制
表位以及回车都不会对结果程序造成影响。
注意尽管在C 和C++里是合法的,但在Java 里不能象下面这样书写代码:

int x = 12;
{
int x = 96; /* illegal */
}
}

编译器会认为变量x 已被定义。所以C 和C++能将一个变量“隐藏”在一个更大的作用域里。但这种做法在
Java 里是不允许的,因为Java 的设计者认为这样做使程序产生了混淆。

2 . 3 . 2 对象的作用域

Java 对象不具备与主类型一样的存在时间。用new 关键字创建一个Java 对象的时候,它会超出作用域的范
围之外。所以假若使用下面这段代码:

{
String s = new String("a string");
} /* 作用域的终点 */

那么句柄s 会在作用域的终点处消失。然而,s 指向的String 对象依然占据着内存空间。在上面这段代码
里,我们没有办法访问对象,因为指向它的唯一一个句柄已超出了作用域的边界。在后面的章节里,大家还
会继续学习如何在程序运行期间传递和复制对象句柄。
这样造成的结果便是:对于用new 创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C
和C++里特别突出。看来在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,
根本无法确定它们是否可用。而且更麻烦的是,在C++里,一旦工作完成,必须保证将对象清除。
这样便带来了一个有趣的问题。假如Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程
序的“凝固”呢。在C++里,这个问题最令程序员头痛。但Java 以后,情况却发生了改观。Java 有一个特别
的“垃圾收集器”,它会查找用new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由
那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地
创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在C++里很常见的一个编程问题:由于程
序员忘记释放内存造成的“内存溢出”。

转载请注明原文地址:http://www.lingshu.xin/article/384f5864.html

你可能感兴趣的:(java,java编程思想,java编程思想,java)