摘自:Think In Java
从技术角度说。OOP(面向对象程序设计)仅仅是涉及抽象的数据类型、继承以及多形性。但还有一些问题也可能显得很重要。本节将就这些问题进行探讨。最重要的问题之中的一个是对象的创建及破坏方式。对象须要的数据位于哪儿,怎样控制对象的“存在时间”呢?针对这个问题。解决的方案是各异其趣的。C++觉得程序的执行效率是最重要的一个问题,所以它同意程序猿作出选择。为获得最快的执行速度。存储以及存在时间可在编敲代码时决定。仅仅需将对象放置在堆栈(有时也叫作自己主动或定域变量)或者静态存储区域就可以。这样便为存储空间的分配和释放提供了一个优先级。
某些
情况下,这样的优先级的控制是很有价值的。然而。我们同一时候也牺牲了灵活性。由于在编敲代码时,必须知道对象的准确的数量、存在时间、以及类型。假设要解决的是一个较常规的问题,如计算机辅助设计、仓储管理或者空中交通控制,这一方法就显得太局限了。第二个方法是在一个内存池中动态创建对象。该内存池亦叫“堆”或者“内存堆”。
若採用这样的方式,除非
进入执行期,否则根本不知道究竟须要多少个对象。也不知道它们的存在时间有多长,以及准确的类型是什么。这些參数都在程序正式执行时才决定的。若需一个新对象,仅仅需在须要它的时候在内存堆里简单地创建
它就可以。由于存储空间的管理是执行期间动态进行的。所以在内存堆里分配存储空间的时间比在堆栈里创建的时间长得多(在堆栈里创建存储空间一般仅仅须要一个简单的指令。将堆栈指针向下或向下移动就可以)。由
于动态创建方法使对象本来就倾向于复杂。所以查找存储空间以及释放它所需的额外开销不会为对象的创建造成明显的影响。除此以外,更大的灵活性对于常规编程问题的解决是至关重要的。
C++同意我们决定是在敲代码时创建对象。还是在执行期间创建。这种控制方法更加灵活。大家也许觉得既然它如此灵活,那么不管怎样都应在内存堆里创建对象,而不是在堆栈中创建。但还要考虑另外一个问题,亦即对象的“存在时间”或者“生存时间”(Lifetime)。
若在堆栈或者静态存储空间里创建一个对象,编译
器会推断对象的持续时间有多长,到时会自己主动“破坏”或者“清除”它。程序猿可用两种方法来破坏一个对象:用程序化的方式决定何时破坏对象,或者利用由执行环境提供的一种“垃圾收集器”特性。自己主动寻找那些不再使用的对象,并将其清除。当然,垃圾收集器显得方便得多,但要求全部应用程序都必须容忍垃圾收集器的存在,并能默许随垃圾收集带来的额外开销。但这并不符合C++语言的设计宗旨。所以未能包含到C++
里。但Java 确实提供了一个垃圾收集器(Smalltalk 也有这种设计。虽然Delphi 默觉得没有垃圾收集器,但可选择安装;而C++亦可使用一些由其它公司开发的垃圾收集产品)。本节剩下的部分将讨论操纵对象时要考虑的还有一些因素。