现在的位置: 首页 > 综合 > 正文

初学者趣味性理解面向对象编程

2012年09月29日 ⁄ 综合 ⁄ 共 4790字 ⁄ 字号 评论关闭
说来挺不好意思,本人的理论功夫着实不扎实,平时自己理解,但要描述出来并让人听懂,还真是有点儿困难。这不,今儿碰上九奸九姐的事儿了!我承认,我摊上事儿了!
 
话说,吃一斤土长一口牙,为了给更多解惑,节省生命,我大胆的在网上摘取了两段挺有意思的解说,不知看官看到过没有,知道的话就直接跳出吧,哈哈~~
 
PS:以下内容摘自网络,本人概不出具出生证明等一应证件。如有雷同,纯属民意,执法部门请回避!
 
==文一:
 
  什么是对象?用我们的话说就是一个根据它的模板(类)创造出来的实实在在的东西。
  什么是类?就是就一个模型。例如:我们过年有的时候吃鱼花对吧? 鱼花有一个木头的模型,把面放进去,然后这么一按,就出来鱼形的馒头了。
  这里的这个模型 就是类,这里的这个出来的鱼形馒头 就是对象了。
  然后,你本来在类里面刻上了鱼花的条纹、眼睛等(就是类的成员),然后出来的这个鱼花(也就是对象)它也有自己的眼睛、条纹等,这么说就恍然大悟了把?
  别着急,这个一开始学都很难理解的,只可意会,不可言传,这是我们老师的原话,顺便告诉你一下,我也是学了两个礼拜才弄明白这个问题...都得有这么一个过程,而面向对象呢,简单的说就是 java 里基本都是通过先创建对象 然后编程的这么一个过程,慢慢来,你会明白的~!
 
 
==文二:
 
  面向对象(只谈我个人的理解):将实现部分封装起来,仅为使用者提供调用接口,使得程序易于重用和维护,同时也加强了内部数据的保护。
  举一个例子:
  定义一个对象china:
  它有一个public方法(即接口):fire(开火)
  一个私有成员:money(金钱) ,一个公有成员fury(怒气)
 
  现在,日本在钓鱼岛上跳蚤,我们要对日宣战,只需要一句代码china.fire(Japan);(至于开火实现的细节,要用的原子弹从哪儿来,核潜艇加了油没有,军费步兵给多少,空军给多少,他们又怎么联系,调用者全不用考虑)在开火的同时,china的公有数据成员fury日本是可以看到的,怒火指数已经到了9.9,小日本吓得胆颤心惊,但是china的私有数据成员money是不能被外界访问的,因此日本无法知道我们还有多少军费。
 
  使用面向对象的方法,既可以保护程序员隐藏实现细节和数据安全,又可以简化使用者的操作方法。看,china.fire(Japan),打个日本多简单,老少皆会用啊,甚至还可马上使出来china.fire(老美、老英、老澳)...
 
 
 
以下为拓展阅读,感兴趣(且有时间)的请往下沉,这里还为没有收获的GGMM提供了免费班车==【走你】
 
 
 
 
==文四:
 
  面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 
 
  例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。 
 
  而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。 
 
  可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。 
 
  功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。 
 
  再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。 
 
  当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
 
 
==文三:
 
  谈到面向对象,其实应该没什么好说的了。弹指十多年,这个东西已经不是什么新鲜概念而是事实上的开发标准了。不过对于大多数初学者,甚至是不在少数的一些 Coder 来讲 OO 还是一个概念而没有成为一种思想。
  那么究竟怎么理解 OO 呢?
  首先你得搞明白 Object 的含义。所谓对象,在 Developer 眼里万物皆为对象。
  比如,我们从早上起床开始:
  睁开眼(Object)看见天(Object)亮了,那是因为有光(Object),抬头(Object)望望窗(Object)外,太阳(Object)出来了...
  我们能叫上名字的各种实体就是对象,而我们接触到的就是这些对象的实例(Instance)。所以面向对象首先就是面向我们能接触到的各个实例。但这样就有问题了,我要这样说:早上起床睁开对象看见对象亮了,那是因为有对象,抬对象望望对象外,对象出来了...不但我自己糊涂你还得骂我神经病,呵呵。
  因为我们接触到的各个对象实例有很大的不同,才有这五彩缤纷的世界。要是一眼望过去全是一模一样的“对象”,我会疯掉,相信你也会。所以我们会根据不同的实例来细分这些对象:
  睁开眼(Object:Eye)看见天(Object:Sky)亮了,那是光(Object:Light),抬头(Object:Head)望望窗(Object:Window)外,太阳(Object:Sun)出来了...
  是不是清楚多了?那么我们是怎么区分这些对象呢?天上有一个太阳一个月亮,我们从小就知道它们是不同的,甚至不需要理由。为什么?因为它们的外观形态活动规律都有极大的区别,这个就是它们各自独有的特征了。这些特征有些是可以用数值来描述的,例如肩高超过 38 厘米的属于大型犬(我们某些衙门一刀切政策的特征),这些是对象具有的状态;有些是根据其动作来判断的,例如会叫的狗不咬人(千万别信!),这些是对象具有的行为。我们区分所有的对象都是靠它们具有的状态和行为来识别,比如你看见一个对象,它有5吨重,3米高,四条粗腿,一条长鼻子,两只大白牙,即使你从没见过你也应该知道它是什么,因为它具有的这些特征我们至少从书本上见过。再比如我现在敲这段文字的时候,腿上一阵奇痒,不用看我就知道屋子里至少有一只蚊子而且还是位蚊子小姐,因为我已经知道在这种情况下只有母蚊子才具有“叮”这种行为。
  新的问题又来了。比如我们这个小区有不少养宠物的,每天傍晚狗跳猫蹿的煞是热闹。看上去狗都是狗猫都是猫,可是每只狗都有不同每只猫也都相异。原因是它们主要的状态和行为虽然都完全相同,却又都有各自独有的特性。所以我们还得继续细分,这就有了类(Class)。类的状态称为属性(Property),而行为就是方法(Method)了。
  我知道吉娃娃是狗,雪纳瑞也是狗,只不过两者看上去的差异实在是巨大。但它们都有犬类的主要属性和方法(别以为吉娃娃就不咬人,你试试看?呵呵),因此它们都属于犬科动物(Class Canine)。而且我还知道犬科动物属于哺乳动物(Class Mammalia),哺乳动物属于动物(Class Zoology),动物属于生物(Class Biology);生物呢?我不知道了(对不起中学生物老师了,呵呵),就直接归类到对象吧。OK,整理一下:
  Object——Biology——Zoology——Mammalia——Canine——Schnauzer|Chihuahua
  耶?很面熟吧。对了,忽略掉 Object 再把其他分支加上去就是生物分类树了。我不是生物学家但我知道一个生物学家要研究犬科动物他决定不会试图去找一只 Canine,因为压根儿就没有这种东东,他只能去研究Schnauzer、Chihuahua或者其他什么能找到的狗狗,因为我们只能接触到 Instance!
  好了,到这里你应该有点想法了吧。等等,最重要的类还没怎么说呢!初学者一接触 OO,通常就是被类搞得有点迷糊,很多教材上来就是一句“要理解面向对象首先要理解类!”,然后抓住 Class 一通猛灌,你酒量大点还行,否则难免被灌到晕菜。
  而我费了这么多口舌为什么还没有讲到什么是类?因为类这个东西本来就是抽象的,是对象具有的属性和方法的集合,你搞清楚了对象、实例、属性、方法,我就不信以你的智慧还不知道什么是类。
  接下来我们看看这些术语在软件开发中的定义:
  对象(Object)——对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。——专业的解释是不是很艰涩?
  对象具有状态,一个对象用数据值来描述它的状态。——对象既然是实体,当然会有状态,比如说我现在的状态是:清醒,还有饿(先去找找有什么吃的吧)
  对象还有行为,用于改变对象的状态。——对象要么是活的,可以自己改变状态,比如我困了就会去睡,睡觉的时候状态就改变了(睡着了就不饿了~~55~居然没找到能填肚子的);要么是死的,可以被活的对象改变状态,比如要是我现在找到一包泡面,我担保它很快改变它的状态。
  对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。——我想着这篇文字,动手把它敲出来,动手得我自己来(我要是有秘书的话...那至少也得动嘴吧),知识也是我自己的(如果不是那就成盗版了)。
  类(Class)——具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。——有点拗口吧,你要是上来就看这个不去管 Object,不晕才怪。
  类具有属性(Property),它是对象的状态的抽象,用数据结构来描述类的属性。——想想生物学家靠什么分类生物的。
  类具有方法(Method),它是对象的行为的抽象,用方法名和实现该方法的操作来描述。——你被狗咬过没?没有?那你被蚊子咬过没?
  类具有事件(Event),它是对象的一个消息,告知对象有重要情况发生,事件还允许在不同任务之间进行通信。——被狗或蚊子咬的时候你会有什么感觉?没有?Kao!I 服了 U!
  不得不提到 消息(Message)
  对象之间进行通信的结构叫做消息。在对象的方法中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。——想想你打电话或发邮件的过程,我们研究对象和类最终的目的是为了传递消息。对我们来说,世上没有无意义的状态和行为,所有这些我们都理解为对对象认知的消息。

 

您还没看够吗?下班了,有免费班车==【走你】

抱歉!评论已关闭.