对象是理解面向对象技术的关键。现在环视四周你就会发现许多真实世界的对象范例:你的小狗,你的桌子,你的电视机,还有你的自行车。
真实世界的对象共享了两种特征:他们都拥有状态与行为。小狗有状态(名字,颜色,品种,饿了)和行为(咆哮,迷人,摇尾巴)。自行车同样有状态(当前的档位,当前的踏板节奏,当前的速度)和行为(改变档位,改变踏板节奏,改变速度)。识别真实世界对象的这些状态和行为是开始考虑面向对象编程术语的一种主要方式。
现在花几分钟时间来观察你周围的真实世界对象。至于你所看到的每个对象,需要询问你自己两个问题:[这个对象可以有怎样的状态?]和[这个对象可以完成怎样的行为?]。确保把你的观察记下来。这样你就会注意到真实世界对象的变化是多样的;你的台灯可能只有两个状态(开或者关)和两个行为(打开或者关闭),但是你的台式收音机可能有额外的状态(开,关,当前音量,当前频道)和行为(打开,关闭,增加音量,减少音量,搜索,扫描和调音)。你同样还有可能注意到一些对象,同样会包含其他对象。最后,这些真实世界的观察全部都会被翻译成面向对象的编程世界。
一个软件对象。
软件对象的概念类似于真实世界的对象:它们也由状态与相关的动作所组成。对象把它的状态存储在字段(一些编程语言中的变量)中并且通过方法(一些编程语言中的功能)来暴露它的行为。方法操作一个对象的内部状态并且与对象到对象的通讯的主要机制一样提供服务。隐藏内部状态并且要求所有的交互都通过对象的方法而被完成,这就是数据封装,面向对象编程的基本原则。
考虑一部自行车,例如:
作为软件对象的自行车模型。
通过定义状态(当前的速度,当前的踏板节奏,和当前的档位)和提供改变这些状态的方法,对象仍然保持着对于外部世界所允许使用的控制。例如,如果自行车有 6 种档位,那么一个改变档位的方法就可能会拒绝小于 1 或者大于 6 的任何值。
把代码建立到单独的软件对象中可以提供许多的好处,包括:
- 模块化:被编写的对象源代码可以独立于其他对象的源代码而得到维护。一旦对象被创建,它就可以简单地在系统的内部进行传递。
- 信息隐藏:通过只对于对象方法的相互作用,它详细的内部实现就会从外部世界中被隐藏。
- 代码重用:如果对象已经存在(或许由其他软件开发者所编写),你就可以在你的程序中使用这个对象。这样允许专家完成对于特定任务对象的复杂实现 / 测试 / 设计,然后你就可以在你自己的代码中信任并且运行它。
- 易于插拔和调试:如果一个特定的对象出现问题,你就可以简单地把它从你的应用程序中移除并且插入一个不同的对象来替代它的位置。这与在真实世界中修复机械性的问题有点类似。如果平衡被打破,你就可以替换它,而不是整个机器。