1.4 面向对象的基本概念
面向对象程序设计是模拟现实世界而产生的一种编程方法,是对事物的功能抽象与数据抽象,并将解决问题的过程看成一个分类演绎的过程。其中,对象与类是面向对象程序设计的基本概念。
1.4.1 对象与类
在现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如学生、汽车等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分与动态部分。顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,其属性包括高矮、胖瘦、年龄、性别等。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以转身、微笑、说话、奔跑,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
在计算机世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。例如,现在面临一名足球运动员想要将球射进对方球门这个实际问题,试着以面向对象的思想来解决这一实际问题。步骤如下:
首先可以从这一问题中抽象出对象,这里抽象出的对象为一名足球运动员。
然后识别这个对象的属性。对象具备的属性都是静态属性,如足球运动员有一个鼻子、两条腿等,这些属性如图1.5所示。
接着识别这个对象的动态行为,即足球运动员的动作,如跳跃、转身等,这些行为都是这个对象基于其属性而具有的动作,这些行为如图1.6所示。
图1.5 识别对象的属性
识别出这个对象的属性和行为后,这个对象就被定义完成了,然后根据足球运动员具有的特性制定要射进对方球门的具体方案以解决问题。
究其本质,所有的足球运动员都具有以上的属性和行为,可以将这些属性和行为封装起来以描述足球运动员这类人。由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例。这也是进行面向对象程序设计的核心思想,即把具体事物的共同特征抽象成实体概念,有了这些抽象出来的实体概念,就可以在编程语言的支持下创建类,因此说类是那些实体的一种模型,具体如图1.7所示。
图1.6 识别对象具有的行为
图1.7 现实世界与编程语言的对应关系
在图1.7中,通过面向对象程序设计的思想可以建立现实世界中具体事物、实体概念与编程语言中类、对象之间的一一对应关系。
1.4.2 面向对象的三大特征
面向对象程序设计实际上就是对现实世界的对象进行建模操作。面向对象程序设计的特征主要可以概括为封装性、继承性和多态性,接下来针对这3种特性进行简单介绍。
1. 封装性
封装性是面向对象程序设计的核心思想。它是指将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,计算机的主机是由内存条、硬盘、风扇等部件组成,生产厂家把这些部件用一个外壳封装起来组成主机,用户在使用该主机时,无须关心其内部的组成及工作原理,如图1.8所示。
图1.8 主机及组成部件
2. 继承性
继承性是面向对象程序设计提高重用性的重要措施。继承性体现了特殊类与一般类之间的关系。当特殊类包含了一般类的所有属性和行为,并且特殊类还可以有自己的属性和行为时,称作特殊类继承了一般类。一般类又称为父类或基类,特殊类又称为子类或派生类。例如,已经描述了汽车模型这个类的属性和行为,如果需要描述一个小轿车类,只需让小轿车类继承汽车模型类,然后再描述小轿车类特有的属性和行为,而不必再重复描述一些在汽车模型类中已有的属性和行为,如图1.9所示。
图1.9 汽车模型与小轿车
3. 多态性
多态性是面向对象程序设计的重要特征。生活中也常存在多态性,例如,学校的下课铃声响了,这时有学生去买零食,有学生去打球,有学生在聊天。不同的人对同一事件产生了不同的行为,这就是多态性在日常生活中的表现。程序中的多态是指一种行为对应着多种不同的实现。例如,在一般类中说明了一种求几何图形面积的行为,这种行为不具有具体含义,因为它并没有确定具体的几何图形。然后再定义一些特殊类,如三角形、正方形、梯形等,它们都继承自一般类。不同的特殊类都继承了一般类的求面积的行为,可以根据具体的不同几何图形使用求面积公式,重新定义求面积行为的不同实现,使之分别实现求三角形、正方形、梯形等面积的功能,如图1.10所示。
图1.10 一般类与特殊类
综上所述,面向对象的程序设计就是通过建立一些类以及它们之间的关系来解决问题。编程者要根据对象间的关系,建立类的体系,明确它们之间是构成关系还是类属关系,从而确定类之间是包含、引用还是继承。面向对象程序设计的一个很大特点是支持代码的重用,这就要求可重用的类一定要抓住不同实体间的共性特征。当类的定义初步完成后,编程者就可以根据现实事物中对象的行为、对象之间的协作关系对具体工作细化模块,并对这些对象进行有机组装,也就是利用对象进行模块化编程。