连载:面向对象葵花宝典:思想、技巧与实践(7) - “对象”新解

简介:

有了“类”的清晰定义后,“对象”就比较容易理解了。

对象就是一个具体的类,一个真实存在的类。

前面我们提到面向对象是对现实世界的模拟,那么对象就是现实世界中存在的“物体”。

 

例如,“人”是一个类,我就是一个“人”的对象,你也是“人”的对象,奥巴马也是“人”的对象。。。。。。

又比如:你去国美买冰箱,但国美肯定没有一个单独叫做“冰箱”的东西卖给你,而是具体的某台海尔XX型号的冰箱、西门子XX型号的冰箱等。这里的“冰箱”就是一个类,而具体的“某台海尔XX型号冰箱”、“某台西门子XX型号冰箱”就是一个具体的对象。

 

但是,我们要继续深究一下:有了类,为什么还会有对象?“类”和“对象”各自的作用是什么?

 

我们知道,在人类出现以前,世界上就有各种各样的物体了,有恐龙、老虎、鳄鱼、松树、青草、石头、空气。。。。。等等,也就是说,真实存在的是对象,而“类”,是有了人类文明后,根据观察分析,加以归纳总结而的出来的。

 

在软件世界也是这样的,真正存在于软件运行过程中的是“对象”,而不是“类”,“类”只是在程序编写中由程序员分析归纳出来的。这也是面向对象之所以叫做“面向对象”而不是“面向类”的一个原因吧。

 

虽然我们前面定义对象为“一个具体的类”,但这是否意味着必须是先有类后有对象呢?

要回答这个问题,我们首先要澄清几个概念:现实对象、现实类、软件对象、软件类。

 

现实对象:你能看到的物体都可以称为现实对象;

现实类:对现实对象的归纳总结;

软件对象:软件实际运行过程中存在的对象;

软件类:软件设计过程中归纳总结出来的类;

 

定义看起来很简单,但它们的区别和联系是什么呢?

如下图示清晰的描述了它们之间的关系:

 

 

也就是说,首先是存在现实对象,然后人们根据自己的观察角度和要求将现实对象抽象成现实类,然后软件设计人员基于现实类模拟出软件类,最后在程序中将软件类实例化成软件对象,最终的程序就是软件对象的活动和交互。

 

那这样是否意味着只有你能够看见、能够感知的对象才能抽象为类呢?

对于现实类和现实对象来说,可以说确实是这样的;但对于软件类和软件对象并不完全是这样的。

有一句名言叫做“电影来源于生活,但高于生活”,用在面向对象领域中就是“软件类来源于现实类,但高于现实类”,为什么这么说呢?

 

首先,现实类在软件类中必须有对应,但并不是完全一 一对应的,有的时候需要将现实类拆成几个软件类。

例如:比如说ATM机是现实世界真实存在的类,但在做软件设计的时候,可能将ATM机拆分为“ATM认证”、“ATM打印”、“ATM取款”等几个软件类,这些软件类互相配合,最后完成现实世界的ATM机器的功能。

 

其次:软件类并不一定是现实存在的

例如:策略(Strategy)是一个人的概念,但并不是你可以看见或者感知到的;但在软件领域中,这是一个很常见的类

 

也就是说,软件类是对现实类的模拟,但并不简单的等同,除了实现现实类相对应的功能外,我们还会创造出许多现实中并不存在的类,而这个创造过程,正是各种设计方法、设计模式、设计原则大显身手的地方。

 

当你创造出各种各样、丰富多彩的对象后,各种对象开始发挥自己的功能,并且相互作用,相互影响,软件世界就开始运作起来,呈现出多姿多彩的功能和作用,整个软件世界都处于你的控制之下,你甚至只需小小的修改几行代码,整个软件就可能呈现完全不同的功能。

 

你,就是软件世界的上帝!

 

一个简单的对象实例如下:

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();
	}
}

================================================
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/18010199
=================================================

相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
6月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
66 1
|
6月前
|
Serverless 对象存储 C++
第十三章:C++面向对象编程思想详解
第十三章:C++面向对象编程思想详解
115 0
|
人工智能 算法 安全
8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法
对于程序员来说,提高自己的编程能力,算是给自己定的职业发展目标之一,不过定一个成为编程大神的目标很容易,具体做起来可能就不是一件简单的事了。首先,既然决定“我要变得更好”,得先知道“更好”是什么样子的。另外,不能“想变得更好”,却没有任何具体可行的措施。
920 2
8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法
|
存储 Java 数据处理
升华数组-使用链表灵活整理数据 | 带你学《Java面向对象编程》之八十九
数组的存在的确便利了大量的数据处理,但其有一个严重的限制是长度必须固定。本节将带领读者“自定义”数据结构,使用链表达到和数组一样的效果。
升华数组-使用链表灵活整理数据 | 带你学《Java面向对象编程》之八十九
|
算法 Java DataX
数组算法进阶之探究转置之法 | 带你学《Java面向对象编程》之十九
本节列举了两个转置数组元素的方案,并辅以内存分析辨明两种方案的优劣,带领读者迅速掌握其中的算法思想。
数组算法进阶之探究转置之法   | 带你学《Java面向对象编程》之十九
|
Java 索引
教你从实战中领悟继承(下) | 带你学《Java面向对象编程》之四十四
本节基于数组类型数据,带着读者进行数组相关操作类的编写,帮助读者彻底掌握继承。
教你从实战中领悟继承(上) | 带你学《Java面向对象编程》之四十二
本节将结合学校情景与职场情景进行简单类编写实战,通过符合常识的逻辑抽象体现继承的理念。
|
机器人 算法 程序员
IT思想类智力题
1、 台阶问题 题目:一个人上台阶可以一次上一个或两个,问这个人上n层的台阶,一共有多少种走法。 本题可以采用递归的方法来设计模型,先从数字的规律入手:假设共有i阶台阶,走完所有的台阶有n种走法,则存在如表6- 3所示。
1114 0