《编程原本 》一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).修改一个对象并不会对它的任何拷贝产生影响.
本书将使用一种编程语言,在该语言里不能脱离对象和对象类型去描述值和值类型.由于这种情况,从现在开始,只要提到类型时没加修饰词,那么就是指对象类型.

相关文章
|
7月前
|
Java 程序员
揭秘编程世界的构造块:一文教你理解方法的本质与运用
揭秘编程世界的构造块:一文教你理解方法的本质与运用
46 0
|
存储 安全 Java
基础一:一切都是对象
基础一:一切都是对象
105 0
|
安全 Java 编译器
深挖⾯向对象编程三⼤特性 --封装、继承、多态
深挖⾯向对象编程三⼤特性 --封装、继承、多态
深挖⾯向对象编程三⼤特性 --封装、继承、多态
|
Java Apache
集合的特别要注意地方哈
《系统设计》系列
80 0
|
Java
使用java反射机制读取任意类内部细节
使用java反射机制读取任意类内部细节
135 0
|
Java 开发者
传统属性赋值弊端|学习笔记
快速学习传统属性赋值弊端
129 0
传统属性赋值弊端|学习笔记
|
存储 负载均衡 Oracle
面向(过程、对象、组件、服务)编程
面向(过程、对象、组件、服务)编程
321 0
《编程原本 》一2.6 总结
本节书摘来自华章出版社《编程原本 》一书中的第2章,第2.6节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
813 0
|
机器学习/深度学习 人工智能 JavaScript
《编程原本 》一3.3 程序变换
本节书摘来自华章出版社《编程原本 》一书中的第3章,第3.3节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
1206 0
|
算法
《编程原本 》一导读
本书是想奉献给那些希望更深入地理解程序设计的人们,无论他们是专职软件开发人员,还是把程序设计看作其专业活动中一个重要组成部分的科学家或工程师.
1051 0