## 连载:面向对象葵花宝典:思想、技巧与实践(7) - “对象”新解
有了“类”的清晰定义后,“对象”就比较容易理解了。
**对象就是一个具体的类,一个真实存在的类。**
前面我们提到面向对象是对现实世界的模拟,那么对象就是现实世界中存在的“物体”。
例如,“人”是一个类,我就是一个“人”的对象,你也是“人”的对象,奥巴马也是“人”的对象。。。。。。
又比如:你去国美买冰箱,但国美肯定没有一个单独叫做“冰箱”的东西卖给你,而是具体的某台海尔XX型号的冰箱、西门子XX型号的冰箱等。这里的“冰箱”就是一个类,而具体的“某台海尔XX型号冰箱”、“某台西门子XX型号冰箱”就是一个具体的对象。
但是,我们要继续深究一下:有了类,为什么还会有对象?“类”和“对象”各自的作用是什么?
我们知道,在人类出现以前,世界上就有各种各样的物体了,有恐龙、老虎、鳄鱼、松树、青草、石头、空气。。。。。等等,也就是说,真实存在的是对象,而“类”,是有了人类文明后,根据观察分析,加以归纳总结而的出来的。
在软件世界也是这样的,真正存在于软件运行过程中的是“对象”,而不是“类”,“类”只是在程序编写中由程序员分析归纳出来的。这也是面向对象之所以叫做“面向对象”而不是“面向类”的一个原因吧。
虽然我们前面定义对象为“一个具体的类”,但这是否意味着必须是先有类后有对象呢?
要回答这个问题,我们首先要澄清几个概念:现实对象、现实类、软件对象、软件类。
现实对象:你能看到的物体都可以称为现实对象;
现实类:对现实对象的归纳总结;
软件对象:软件实际运行过程中存在的对象;
软件类:软件设计过程中归纳总结出来的类;
定义看起来很简单,但它们的区别和联系是什么呢?
如下图示清晰的描述了它们之间的关系:
![](https://box.kancloud.cn/2016-01-20_569f5cc9438b1.jpg)
也就是说,首先是存在现实对象,然后人们根据自己的观察角度和要求将现实对象抽象成现实类,然后软件设计人员基于现实类模拟出软件类,最后在程序中将软件类实例化成软件对象,最终的程序就是软件对象的活动和交互。
那这样是否意味着只有你能够看见、能够感知的对象才能抽象为类呢?
对于现实类和现实对象来说,可以说确实是这样的;但对于软件类和软件对象并不完全是这样的。
有一句名言叫做“电影来源于生活,但高于生活”,用在面向对象领域中就是“软件类来源于现实类,但高于现实类”,为什么这么说呢?
首先,现实类在软件类中必须有对应,但并不是完全一 一对应的,有的时候需要将现实类拆成几个软件类。
例如:比如说ATM机是现实世界真实存在的类,但在做软件设计的时候,可能将ATM机拆分为“ATM认证”、“ATM打印”、“ATM取款”等几个软件类,这些软件类互相配合,最后完成现实世界的ATM机器的功能。
其次:软件类并不一定是现实存在的
例如:策略(Strategy)是一个人的概念,但并不是你可以看见或者感知到的;但在软件领域中,这是一个很常见的类
也就是说,软件类是对现实类的模拟,但并不简单的等同,除了实现现实类相对应的功能外,我们还会创造出许多现实中并不存在的类,而这个创造过程,正是各种设计方法、设计模式、设计原则大显身手的地方。
当你创造出各种各样、丰富多彩的对象后,各种对象开始发挥自己的功能,并且相互作用,相互影响,软件世界就开始运作起来,呈现出多姿多彩的功能和作用,整个软件世界都处于你的控制之下,你甚至只需小小的修改几行代码,整个软件就可能呈现完全不同的功能。
**你,就是软件世界的上帝!**
一个简单的对象实例如下:
~~~
<span style="font-size:14px;">package com.oo.demo;
public class Tester {
public static void main(String[] args) {
// 奥巴马是一个“人”的对象
Person obama = new Person();
obama.setName("Obama");
obama.playBasketball();
System.out.println();
// 我也是一个“人”的对象
Person me = new Person();
me.setName("Yunhua Lee");
me.playFootball();
}
}</span>
~~~
- 前言
- (1) - 程序设计思想的发展
- (2) - 面向对象语言发展历史
- (3) - 面向过程 vs 面向对象
- (4) - 面向对象是瑞士军刀还是一把锤子?
- (5) - 面向对象迷思:面向对象导致性能下降?
- (6) - 不要说你懂“类”
- (7) - “对象”新解
- (8) - “接口” 详解
- (9) - “抽象类” 详解
- (10) - “抽象” 详解
- (11) - “封装” 详解
- (12) - “继承” 详解
- (13) - “多态” 详解
- (14) - 面向对象开发技术流程
- (15) - 需求详解
- (16) - 需求分析终极目的
- (17) - 需求分析518方法
- (18) - 用例分析
- (19) - 功能点提取
- (20) - 用例图的陷阱
- (21) - SSD
- (22) - 领域模型
- (23) - 领域建模三字经
- (24) - 设计模型
- (25) - 类模型
- (26) - 类模型三板斧
- (27) - 动态模型设计
- (28) - 设计原则:内聚&耦合
- (29) - 高内聚低耦合
- (30) - SRP原则
- (31) - OCP原则
- (32) - LSP原则
- (33) - ISP原则
- (34) - DIP原则
- (35) - NOP原则
- (36) - 设计原则如何用?
- (37) - 设计模式:瑞士军刀 or 锤子?
- (38) - 设计模式之道
- (39) - 设计原则 vs 设计模式
- (40) - DECORATOR模式
- (完)- 书籍已经出版