
对象导论:对象的创建和生命期
在使用对象时,最关键的问题之一便是他们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存。当我们不再需要一个对象时,它必须被清理掉,使其占有的资源可以被释放和重用。在相对简单的编程情况下,怎样清理对象看起来似乎不是什么挑战:你创建了对象,根据需要使用它,然后它应该被销毁。然而,你很有可能会遇到相对复杂的情况。例...
在使用对象时,最关键的问题之一便是他们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存。当我们不再需要一个对象时,它必须被清理掉,使其占有的资源可以被释放和重用。在相对简单的编程情况下,怎样清理对象看起来似乎不是什么挑战:你创建了对象,根据需要使用它,然后它应该被销毁。然而,你很有可能会遇到相对复杂的情况。例...
通常说来,如果不知道在解决某个特定问题时需要多少个对象,或者它们将存活多久,那么就不可能知道如何存储这些对象。如何才能知道需要多少空间来创建这些对象呢?答案是你不可能知道,因为这类信息只有在运行时才能获得。对于面向对象设计中的大多数问题而言,这个问题的解决方案似乎过于轻率:创建另一种对象类型。这种新的对象类型持有对其...
在OOP中,自C++面世以来就已变得非常瞩目的一个问题就是,是否所有的类最终都继承自单一的基类。在Java中,答案是yes,这个终极基类的名字就是Object。事实证明。单根继承结构带来了很多好处。在单根继承结构中的所有对象都具有一个公用接口,所以它们归根到底都是相同的基本类型。另一种结构是无法确保所有的对象都属于同一个基本类型。从向...
在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当做其基类的对象来对待。这使得人们可以编写出不依赖于特定类型的代码。在“几何形”的例子中,方法操作的都是泛化的形状,而不关心它们是圆形、正方形、三角形还是其他什么尚未定义的形状。所有的几何形状都可以被绘制、擦除和移动,所以这些方法都是直接对...
对象这种观念,本身就是十分方便的工具,使得你可以通过概念将数据和功能封装到一起,因此可以对问题空间的观念给出恰当的表示,而不用受制于必须使用底层机器语言。这些概念用关键字class来表示,他们形成了编程语言中的基本单位。这样做还是有很多麻烦:在创建了一个类之后,即使另一个新类与其具有相似的功能,你还是得重新创建一个新类。...
一旦类被创建并被测试完,那么在理想情况下它就应该代表一个有用的代码单元。事实证明,这种复用性并不容易达到我们所希望的那种程度,产生一个可复用的对象设计需要丰富的经验和敏锐的的洞察力。但是一旦你有了这样的设计,他就可以复用。代码复用是面向对象程序设计语言所提供的最了不起的优点之一。最简单地复用某个类的方式就是直接使用该...
将程序开发人员按照角色分为类创建者和客户端程序员是大有裨益的。客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标是构建类,这种类只向客户端程序员暴露必须的部分,而隐藏其他部分。为什么要这样呢?因为如果加以隐藏,那么客户端程序员将不能够访问它,这意味着类创建者可以任意修改被隐藏的部分,而不用担心对其他...
将对象想象为“服务提供者”是程序员在试图开发或理解一个程序设计时最好的方法之一。程序本身向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或在现有的代码库中寻找)能够提供理想的服务来解决问题的一系列对象。着手从事这件事的一种方式就是问一下自己:“如果我可以将问题从表象中抽取出来,那么什...
所有的对象都是唯一的,但同时也是具有相同特性和行为的对象所归属的类的一部分。这种思想被直接应用于Simula-67(第一个面向对象语言),它在程序中使用基本关键字class来引入新的类型。Simula,是为了开发诸如经典的“银行出纳员问题”(bank teller problem)这样的仿真程序而创建的。在银行出纳员问题中,有出纳、客户、账户、交易、和货...
汇编语言是对底层机器的轻微抽象,“命令式”语言(如C、BASIC)是对汇编语言的抽象。虽然“命令式”语言在汇编语言的基础上有了大幅度改进,但他们所作的主要抽象仍然是基于计算机的结构,而不是基于所要解决的问题的结构。程序员必须建立起在机器模型和实际待解决问题的模型之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的...