面向对象的基本概念

面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看做是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心、以算法为驱动的话,面向对象的编程语言则是以对象为中心,以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。
所有面向对象编程语言都支持3个概念,即封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法连在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。
“这个世界是由什么组成的?”这个问题如果让不同的人来回答会得到不同的答案。如果是一个化学家,他也许会告诉你:“还用问吗?这个世界是由分子、原子、离子等化学物质组成的”。如果是一个画家,他也许会告诉你:“这个世界是由不同的颜色所组成的”。但如果让一个分类学家来考虑问题就有趣多了,他会告诉你:“这个世界是由不同类型的物与事所构成的”。好!作为面向对象的程序员,我们要从分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的。动物又分为单细胞动物、多细胞动物、哺乳动物等,哺乳动物又分为人、大象、老虎……就这样分下去了!
现在,从抽象的角度,我们给“类”下个定义吧!我的意思是,从抽象的角度,你回答我“什么是人类?”首先让我们来看看人类所具有的一些特征,这个特征包括属性(一些参数、数值)及方法(一些行为,他能干什么)。每个人都有身高、体重、年龄、血型等一些属性。还有人会劳动、人都会直立行走、人都会用自己的头脑去创造工具等方法。人之所以能区别于其他类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅是一个概念,它是不存在的实体。但是所有具备“人类”这个群体的属性与方法的对象都叫人。这个对象“人”是实际存在的实体。每个人都是人这个群体的一个对象。老虎为什么不是人?因为它不具备人这个群体的属性与方法,老虎不会直立行走,不会使用工具等,所以说老虎不是人。
由此可见,类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际上就是数据类型,例如,整数、小数等。整数也有一组特性和行为。面向过程的语言与面向对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型。而为了模拟真实世界,为了更好地解决问题,我们需往往要创建解决问题所必需的数据类型。
面向对象编程为我们提供了解决方案。以下的考题来自真实的笔试资料,希望读者先不要看答案,自我解答后再与答案加以比对,找出自己的不足。
11.1   面向对象的基本概念
面试例题1:对象与实例有什么区别?
解析:在Java的内存分配中,对象和实例是不同的,前者分配在内存堆里,后者分配在堆栈里,至于为什么要这样分,参考一下其他的资料。对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。
答案:对象和实例从宏观的角度看,区别是:对象是同类事物的一种抽象表现形式,而实例是对象的具体化,一个对象可以实例化很多实例,对象就是一个模型,实例是照着这个模型生产的最终产品。实际上就是这样,一个对象可以实例化 N个实例。就像根据一个模型可以制造多个实际的产品一样。
从内存分配的角度来看,对象是保存在堆中的,而实例是存储在栈中的,实例其实只是对象的一个引用,也就是指向对象的指针。
面试例题2:Java中所有的类都继承了java.lang.Object类,而在C++中没有像java.lang.Object这样的类,这是为什么呢?都是面向对象,Java这样做有什么好处呢?
解析:Java采用的是单根结构,所有的类都继承了java.lang.Object类。对于Java这种纯面向对象的语言来说,这种设计具有很好的灵活性,比如对垃圾收集来说很有利,所有的类都具有java.lang.Object类具有的方法等。C++没有更多这样的方法,大概是为了向后兼容。向C兼容,满足它设计上最大的灵活性。
答案:C++的特点是指针,一个指针可以指向任何的对象、结构、基本类型、函数。
Java没有指针类型,所以Java用Object基础类的共同特征来实现所有对象类型之间的转换。
面试例题3:声明与定义之间的区别是什么?在Java里声明和定义能否分开?
解析:
声明:一种把一个名称引入或者重新引入到某个作用域的构造。
定义:它也是一种声明,但该声明必须给出被声明实体的细节。
对于变量而言,这里的细节是指:为被声明实体保留存储空间。
对于class类型和函数定义而言,指的是包含有一对花括号内容的声明。
对于外部变量而言,指的是前面没有关键字extern或者在声明时就进行初始化。
变量的声明有以下两种情况。
一种是需要建立存储空间的。例如,int a 在声明的时候就已经建立了存储空间。
另一种是不需要建立存储空间的,例如,extern int a。其中,变量a是在别的文件中定义的。前者是“定义性声明(defining declaration)”,或者称为“定义(definition)”,而后者是“引用性声明(referencing declaration)”。从广义的角度来讲,声明中包含着定义,但是并非所有的声明都是定义,例如int a,它既是声明,同时又是定义。然而对于 extern a来讲,它只是声明不是定义。在一般的情况下我们常常这样叙述,把建立空间的声明称为“定义”,而把不需要建立存储空间的声明称为“声明”。很明显在这里指的声明的范围是比较窄的,也就是说非定义性质的声明。
答案:
变量的定义和声明的区别在于是否分配内存,如果分配内存就是定义,否则就是声明。
类中的变量只是声明而不是定义,因为它只是类声明的一部分。不同于变量的定义,类的定义是一种新的类型的定义,只有实例化后才会分配内存。所以类成员变量只是声明而不是定义。
在Java中,利用Interface,也可以将声明和实现分开。如下所示。
   //MyInterface.java   
   public    interface    MyInterface  
{   
         void    method();   
   }   
    
   //MyImpl.java   
   public    class    implements    MyInterface  
{   
         public    void    method()
         {   
               //……
         }   
   }   
面试例题4:Which is incorrect about the class?(关于类的描述下面哪个是错误的?)[金山公司2005年面试题]
A.A class is a blueprint to objects.
B.We use the keyword class to create a class construct.
C.Once a class is declared, the class name becomes a type name and
can be used to declare variables.
D.The class is same as the struct, and there are no different between
class and struct.
解析:这道题的考点是类的概念。
答案:D
面试例题5:Which is incorrect about the OOP?(下面关于面向对象技术的叙述哪个是错误的?)[金山公司2005年面试题]
A.The central idea of OOP is to build programs using software objects.
B.The OOP focuses mainly on the step-by-step procedure as procedure-
oriented programing.
C.The OOP offers many advantages: simplicity,modularity,modifiability,
extensibility, and so on.
D.The key concept of object orientation is the attachment of procedure
to data.
解析:OOP的概念面试例题。面向对象和面向过程不能混为一谈。
答案:B,D
面向对象的程序设计是一种将物体对象化的程序设计语言,主要概念就是类的各种概念,类就是一种结构体,它是物体的抽象表示方法,它主要包括属性和方法两个重要内容!打个比方:假如我们把人定义成为一个类,那么我们的身高,体重,等等这些人体特征就相当于类中的属性,而我们吃饭,穿衣服,跑步这些动作就可以看做是类中的方法!

0.面向对象的思想包括
主要是问题域中的对象和程序的类或对象想对应,
1. 面向对象的分析
2. 面向对象的方案设计
3. 面向对的编程
4. 面向对象的维护

什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方,
特别是这个处于新旧思想交替的时代,许多人刚刚学完现在看来是快要淘汰的只是面向过程的
语言。他们的脑子还没有脱离面向过程思想的束缚,抬头却发现,“面向对象”早已经流行
开来,这个陌生的词漫天飞舞。随便拿起一本流行计算机技术书籍,那里会没有“面向对象”
的字眼!于是心中便惶惑了:什么叫“面向对象”?不感兴趣者,一带而过;有志于在这方
面发展的,匆忙找到一本有关书籍来啃究竟什么是“面向对象”。然而,要突破思想的束缚,
说难也不难,说到要深刻认识却也不容易。笔者在做了一些轻量级的工作后,颇以为有点心
得,不怕贻笑大方,写出已供广大同行批评指正。
“对象(Object)”一词,早在十九世纪就有现象学大师胡塞尔提出并定义。对象是世
界中的物体在人脑中的映象,是人的意识之所以为意识的反映,是做为一种概念而存在的
先念的东西,它还包括了人的意愿。举例说明吧。当我们认识到一种新的物体,它叫树,于
是在我们的意识当中就形成了树的概念。这个概念会一直存在于我们的思维当中,并不会因
为这棵树被砍掉而消失。这个概念就是现实世界当中的物体在我们意识当中的映象。我们对
它还可以有我们自己的意愿,虽然我们并不需要付诸实现——只要在你的脑中想着把这棵树
砍掉做成桌子、凳子等——我们就把它叫做意向。于是,对象就是客观世界中物体在人脑中
的映象及人的意向。只要这个对象存在我们的思维意识当中,我们就可以籍此判断同类的东
西。譬如,当我们看到另外一棵树是,并不会因为所见的第一棵树不在了失去了供参照的模
板而不认识这棵树了。当我们接触某些新事物时,我们的意识就会为这些事物确立一个对象
。当然这个过程是怎么形成的,那就不是我们所能讨论的问题了。
上面所说的对象研究的是一般意义上的问题,因而它可以外推到一切事物。我们经常
所说的“对象”,一班指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来解
决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对
象的分析(Object-Oriented Analysis)、面向对象的设计(Object-Oriented Design)等。应用
前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我
们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个
对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可
以由一个对象来表示。这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员
的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元
组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的
范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向
本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图
等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,
它也只需要做“自己”的事情,因为有元组对象的支持,它无须去考虑像元素是否合法这类
的事情。甚至,有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法。
这样,更能显示面向对象的优势。
上面所讨论的可以说是面向对象的分析方法。在具体的设计过程当中,还应该采用适当
的方式。因为面向对象的思想固然很先进,如果做得不好的话,同样不能达到预期的效果。
这主要表现在处理对象与对象的关系上没有做好,对象与对象的层次不分明。如上面所举得
关系型数据库得例子,如果在元组层面上得对象过多得考虑一个表对象得因素,或一个表层
面上对象过多地考虑一个元组对象的因素,甚至去考虑元素层面上的因素,这些都不是好的
面向对象的设计方法。这一点,在语言实现方面,Java比C++更有优势,因为它不允许多
重继承,从而使对象之间的关系更明确。谁也不会否认C++的功能更强大,但是它也要由次
付出巨大代价——当现在代码库发展到一定程度、一定规模时,个对象之间的层次关系将
变得异常复杂,给后继使用者得学习、理解带来很大的困难,应用上很难把握。另外,虽然
C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C++完全可以不用
面向对象的思想来进行程序设计,当然人们不会这样去做——除了那些只是把C++看成是C
扩充的初学者,这就为以后的发展埋下了隐患。在者一方面,Java的限制更多一点。就者一
点还远远不够。搞开发的是人,开发方法是由人决定的。要应用面向对象的方法开发出优秀
的软件,必须要求开发人员具有良好的面向对象的思想。好的工程师可以利用适当的工具开
发出优秀的软件——而不在乎他所使用的语言工具——Java、C++、Object Pascal、Ada等。
要能应用面向对象的思想熟练得做好系统分析、设计、实现(编程),首先要求开发人
员知道什么是对象,什么是面向对象得概念,否则是谈不上应用面向对象得思想搞软件开发
了。希望读者能在看到我在前面的不太严密、详细的论述之后可以对“对象”这个概念由一
个初步的了解,同时也希望有不同看法的同行提出批评。其次,还要求开发人员有比较丰富的开
发经验。否则,光谈理论,那是不能真正体会“面向对象”的含义的。尽管如此,我们还是
可以定出一般的规则的。抛开生命周期的其它阶段,对一个确立的系统一般可以进行以下几
个过程:
一、首先应用面向对象的思想进行系统分析。仔细的划分系统的各个部分,明确它
们之间的层次关系,然后将各个部分作为一个对象进行功能上的分析。例如,要设计一个用
户界面,它可能由几个主要的窗体组成:主窗体MainFrame、功能性子窗体FunctionFrame
以及对话对话框Dialog。其中,MainFrame中可能还包括菜单、工具条、文本框、状态条等
Windows组件。对于要完成一些重要功能的组件,我们可以单独将它作为一个对象看待,在
具体的实现中,用单独一个类来表示。而一些并不是很重要的、只是在过程中需要用到的组
件,就可以将它们集成到其他对象中去。要明确每个对象自己的任务——不要让它有缺陷,
也不能越殂代庖。各个对象之间的关系通过过程、内容、功能等耦合来实现。
实际上,如果你是用Java进行开发,你会发现swing组件本身就非常好用,因为它们
之间的关系是很分明的——你无须去理解分清象C++中的组件那样复杂的关系。在开发你自
己的组件时,也需要力求达到这样的效果。
二、其次时应用面向对象的思想进行系统设计。其实在真正做好了系统分析的工作之后,
进行设计就比较轻松了。这段时间只要进一步确定各个对象的功能以及各个对象之间的关系
。为了能够更好地帮助实现人员明白各个对象之间的关系,可以利用一些工具将这些组件的
关系表示出来,统一建模语言(Uniformed Module Language,UML)就是这样的一种好东
西。它不仅可以现在帮助开发人员了解整个系统,也为以后的维护工作提供一个档案文件,
给以后的工作提供巨大的方便。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值