# 消息与对象:理解执行模型 > 原书依据:第 1–2 章,印刷页 1–8,PDF 页 12–19。 Smalltalk 的基本动作是:向一个接收者发送消息,由接收者的类决定执行哪个方法。数字、字符串、集合、类和块都能成为接收者。程序由相互发送消息的对象组成。 ## 把表达式拆成三个部分 ```smalltalk 8 + 5 'hello' size #(10 20 30) at: 2 ``` | 表达式 | 接收者 | 选择子 | 参数 | 推演结果 | | --- | --- | --- | --- | --- | | `8 + 5` | 整数 8 | `+` | 5 | 13 | | `'hello' size` | 字符串 | `size` | 无 | 5 | | `#(10 20 30) at: 2` | 数组 | `at:` | 2 | 20 | 消息是请求;方法是为响应请求而执行的实现。选择子标识这次请求的名称。不同类可以实现同一个选择子,因此同一条消息能够触发不同的行为。 ## 变量保存引用 ```smalltalk | first second | first := OrderedCollection new. second := first. first add: 8. second size ``` 预期最后得到 1:两个变量指向同一个集合。赋值没有自动复制集合。理解引用关系,是之后理解浅复制、模型共享和对象检查器的基础。 对象的状态与它支持的消息要分开看。调用方通过协议与对象协作;读取某个内部槽位的调试能力,不等于应用程序应依赖那个槽位。 ## 表达式可以继续发送消息 ```smalltalk (8 + 5) printString ``` 先得到 13,再向结果发送 `printString`。与之不同,`collection add: item` 的结果不一定是集合;链式发送前必须确认方法返回值。[语法篇](/docs/source-studies/smalltalk/syntax-and-blocks)解释如何用级联表达“始终向原接收者发送”。 ## 镜像为什么重要 原书描述的 virtual image 是包含对象和类的系统世界。开发时可以浏览类、编译方法、检查运行对象并继续执行。语言工具和应用共享对象体系,使重用既有类库成为日常开发方式。 这是历史系统的组织方式;不能据此推断任意镜像的持久化、发布或隔离策略。研究时要同时记录类的定义和当前镜像状态,避免把一次手工修改当成可复现的工程成果。 ## 自检 为何两个对象都能接收 `size`,却不需要有相同的数据布局?因为调用方依赖消息协议,各自的类提供方法。下一篇从词法和优先级说明如何读出真正发送的消息。