1.3 对象
一个存储(memory)就是一集存储字(word),其中每个字有一个地址(address)和一项内容(content).地址是一种固定大小的值,这个大小称为地址长度.而内容是另一固定大小的值,其长度称为字长.通过装载(load)操作可以取得一个地址的内容.通过保存(store)操作改变一个地址所关联的内容.存储的实例如计算机主存里的一组字节,或磁盘驱动器里的一组区块.
一个对象(object)就是一个具体实体的表示,并且是作为某个存储里一个值.对象有状态(state),其状态就是某个值类型的一个值.对象的状态可以改变.对于给定的与某个具体实体对应的一个对象,其状态对应于该实体的一个快照.一个对象拥有一集资源(resource),用于保存其状态,如一些存储字或者文件里的一些记录.
即使某对象的值是一个连续的0/1序列,保存这些0/1的资源也可以不是连续的.相应的解释能给出这个对象的整体.看一个例子:两个double 可以解释为一个复数,为此并不要求它们紧邻存放.一个对象的资源也完全可以位于不同的存储里.但是本书只处理位于一个具有统一地址空间的存储里的对象,这里的每个对象有一个唯一的起始地址(startingaddress),从它出发可以找到该对象的所有资源.
一个对象类型(objecttype)是一种在存储中保存和修改值的模式.与每个对象类型相对应的有一个描述该类型对象的状态的值类型.每个对象属于某一个对象类型.作为对象类型的例子,请考虑按32位模二补码方式,采用小尾格式和4字节边界对齐表示的整数.
值和对象扮演着互补的角色.值不会改变,与在计算机里的特定实现方式
1.3 对象
无关.对象可以改变,具有与具体计算相关的实现方式.在任何一个时间点,一个对象的状态都可以描述为一个值.原则上说,这个值可以写在纸上(做出一个快照)或者序列化(serialize)后通过通信链路传输.用值的方式描述对象的状态,在讨论相等性时就可以抽象掉对象的具体实现方式.函数式程序设计处理的是值;而命令式程序设计处理的是对象.
我们用值来表示实体.因为值是不变的,它们可以表示抽象实体.也可以用值的序列来表示某具体实体的一些快照的序列.对象保存着代表实体的值.由于对象可以变化,因此可以用于表示具体实体,并通过令其不断取得新值的方式表示该实体的变化.也可用对象表示抽象实体,这时它们将保持不变,或者取相应抽象实体的一些不同近似值.
在计算机里使用对象,有如下三个原因.
1.对象能模拟可以改变的具体实体,例如工资系统里的雇员记录.
2.对象为实现值上的函数提供了强有力的支持,例如写一个用迭代算法实现浮点数平方根的过程.
- 带存储的计算机是目前唯一可用的通用计算设备.
值类型的某些性质也可用于对象类型.一个对象是良形式的(well-formed),当且仅当其状态是良形式的.一个对象类型是真部分的(properlypartial),当且仅当其值类型是真部分的;否则它就是全的(total).一个对象类型是唯一表示的(uniquelyrepresented),当且仅当其值类型是唯一表示的.
由于具体实体有标识,表示它们的对象也要有与之对应的概念.一个标识符号(identitytoken)是一个唯一值,它表示相应对象的标识,可以从相应对象的值及其资源的地址计算出来.标识符号的例子如对象的地址,或者到保存着该对象的数组里的下标,或者人事记录里的雇员编号.对标识符号的相等检查对应于实体标识的相等检查.在应用系统运行期间,一个特定对象有可能在一个数据结构里移动,也可能从一个数据结构移动到另一个,这种移动有可能改变对象的标识符号.
同样类型的两个对象相等(equality),当且仅当它们的状态相等.如果两个对象相等,我们就说其中的一个是另一个的拷贝(copy).修改一个对象并不会对它的任何拷贝产生影响.
本书将使用一种编程语言,在该语言里不能脱离对象和对象类型去描述值和值类型.由于这种情况,从现在开始,只要提到类型时没加修饰词,那么就是指对象类型.