
2.1 面向对象的基本概念
面向对象是一种程序设计方法和设计规范(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
Java语言是依据面向对象的原理设计而成的,而面向对象有助于解决复杂的程序问题,在系统地学习Java语言之前,用户必须先了解一些基本的面向对象的概念。
2.1.1 类和对象
将众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方法。类是具有相同属性和方法的一组对象的集合。从面向对象的概念来看,真实世界中每个看得见的东西都是对象,如“纸”“飞机”“小狗”和“摩天大楼”等都可以看成一个对象。“属性”是对象的静态描述,而“方法”则是对象的动态描述,或解释为操作对象的方式。类描述了对象的构造,而且可用于构建对象的蓝图。定义了类之后,该类的名称即成为新的数据类型,且可用于声明该类型的变量和创建该类型的对象。
2.1.2 属性与方法
例如,如何描述“银行账户”这个对象呢?将它分为属性与方法两个方面考虑,与“银行账户”对象相关的静态属性主要有银行账号、户名、密码、账户余额等,而与“银行账户”相关的动态方法有存款、取款、查询余额、更改密码等。
在描述“银行账户”对象的属性和方法时会忽略许多细节,这是正常的,用户可将这些不完整的抽象描述看成是“银行账户”对象的轮廓,事实上对象本来就应该只是一个抽象的轮廓,因为必须依问题的不同来描述不同的对象,而不是详细地将一个对象描述出来。
2.1.3 对象的继承
其实无论是有意或无意地将对象描述抽象化,在许多时候是有好处的,因为在面向对象方法中,对象具有继承(inheritance)的属性。用来描述继承最简单的一句话就是“保留、修改与新增”。
例如,爱迪生发明了“第一代的电灯”,在当时可能是登峰造极的产品,但以现在的眼光来看,这第一代的电灯可能太过耗电、不够明亮,甚至在外观质感上都过于粗糙。后来的公司在改良研发之后,创造了新一代的电灯,新一代的电灯“保留”了电灯应有的基本属性,并“修改”了电灯的耗电量、明亮度和外观,甚至在电灯上“新增”了一个小电子时钟。可以说新一代的电灯是“继承”第一代的电灯而来。
在继承关系下,原来的对象称作父类对象,而新对象称作子类对象,父类和子类之间具有“相同种类”的关系。也就是说,在上面的电灯例子中,称第一代与第二代的产品都是“电灯”的一种,并且用户会发现在继承架构中越底层的子类越具有自己的特征,而越上层的父类往往是越抽象的,如图2-1所示,第三代电灯所具有的特征远远多于第一代电灯。

图2-1 架构中底层子类中的特征
2.1.4 对象的重用
由对象的继承属性还可以看出另一个面向对象方法的优点,即对象的“重用性”。这是非常重要的特色,用户在使用面向对象方法设计程序时应该时时提醒自己,尽量要将对象的重用性最大化。这可以从两方面来说明:一是当用户在创造新对象时,应该以继承现有对象为前提,而不是绞尽脑汁再去创造另一个全新的对象;另一方面应该尽量以现成的对象来构建程序。
例如,定义了一个“人”对象,那么当定义“导游”对象时应该以继承“人”对象为出发点,然后进一步去做“保留、修改和新增”的工作,而不是毫无根据地再定义一个新的导游对象,并且当定义好导游对象之后就应该在所有需要导游对象的程序中重复使用。
对象重用性所带来的好处是:用户定义的对象越多,程序开发越容易,甚至就像堆积木那样轻松与简单(对象=积木)。程序设计中面向对象重用性的一个最佳例子,就是Java所提供的各种API,这些API中的类彼此之间可相互继承,并不断派生新增功能,使得程序设计人员能容易地使用Java设计出功能强大的程序。
2.1.5 对象的封装
导致对象可以被重复使用的关键因素是对象的封装(encapsulation)属性,在此前曾提到过,凡是对象都具有属性和方法,而封装的意思就是将对象的属性和方法做适当程度的“包装”,只留下操作的接口,所以封装也可以说成是一种“信息隐藏”(information hiding)。
封装的最大好处就是会使对象容易使用,用户无须去关心其内部的细节。例如,“录音机”是一个对象,无论其内部构造有多复杂,用户总是由各种“录音键”“播放键”“停止键”等按键来操作录音机。这是因为“录音机”对象已经将其内部的功能做了适当程度的封装,而“录音键”“播放键”和“停止键”即是其所保留的操作接口。
2.1.6 对象的多态性
对象的多态性是指在一般类中定义的属性或方法被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在一般类及其各个特殊类中具有不同的语义。例如,“几何图形”的“绘图”方法,“椭圆”和“多边形”都是“几何图形”的子类,但其“绘图”方法功能不同。