《编程原本 》一1.3 对象

简介: 本节书摘来自华章出版社《编程原本 》一书中的第1章,第1.3节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看

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.对象为实现值上的函数提供了强有力的支持,例如写一个用迭代算法实现浮点数平方根的过程.

  1. 带存储的计算机是目前唯一可用的通用计算设备.

值类型的某些性质也可用于对象类型.一个对象是良形式的(well-formed),当且仅当其状态是良形式的.一个对象类型是真部分的(properlypartial),当且仅当其值类型是真部分的;否则它就是全的(total).一个对象类型是唯一表示的(uniquelyrepresented),当且仅当其值类型是唯一表示的.
由于具体实体有标识,表示它们的对象也要有与之对应的概念.一个标识符号(identitytoken)是一个唯一值,它表示相应对象的标识,可以从相应对象的值及其资源的地址计算出来.标识符号的例子如对象的地址,或者到保存着该对象的数组里的下标,或者人事记录里的雇员编号.对标识符号的相等检查对应于实体标识的相等检查.在应用系统运行期间,一个特定对象有可能在一个数据结构里移动,也可能从一个数据结构移动到另一个,这种移动有可能改变对象的标识符号.
同样类型的两个对象相等(equality),当且仅当它们的状态相等.如果两个对象相等,我们就说其中的一个是另一个的拷贝(copy).修改一个对象并不会对它的任何拷贝产生影响.
本书将使用一种编程语言,在该语言里不能脱离对象和对象类型去描述值和值类型.由于这种情况,从现在开始,只要提到类型时没加修饰词,那么就是指对象类型.

相关文章
|
3天前
|
Java 程序员
揭秘编程世界的构造块:一文教你理解方法的本质与运用
揭秘编程世界的构造块:一文教你理解方法的本质与运用
8 0
|
12月前
|
存储 安全 Java
基础一:一切都是对象
基础一:一切都是对象
71 0
|
Java Apache
集合的特别要注意地方哈
《系统设计》系列
59 0
|
存储 负载均衡 Oracle
面向(过程、对象、组件、服务)编程
面向(过程、对象、组件、服务)编程
252 0
|
存储 Java 开发者
教你从内存理解字符串修改奥秘 | 带你学《Java面向对象编程》之二十九
上一节中已经提到了String对象池的概念,本节中将进一步讲述这个概念,并带着读者一起去领会字符串修改过程中的变化。
|
Java C++
保守VS开放?看清封装对象属性 | 带你学《Java面向对象编程》之四
高楼万丈,起于平地。本节通过对比正反几个实例剖析了封装对象属性的必要性,介绍了进行封装的基本原则。
保守VS开放?看清封装对象属性   |  带你学《Java面向对象编程》之四
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
629 0
|
机器学习/深度学习 人工智能 JavaScript
《编程原本 》一3.3 程序变换
本节书摘来自华章出版社《编程原本 》一书中的第3章,第3.3节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
1153 0
|
算法 JavaScript
《编程原本 》一2.3 碰撞点
本节书摘来自华章出版社《编程原本 》一书中的第2章,第2.3节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
1109 0