Java语言是基于面向对象编程的一种高级程序设计语言。面向对象编程方法强调在软件开发过程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物。
在面向对象编程语言出现之前,程序员主要使用面向过程的方法开发程序。面向过程的编程方法把密切相关、相互依赖的数据和对数据的操作相互分离。这种实质上的依赖与形式上的分离使得大量程序不但难于编写,而且难以调试和修改。面向对象编程技术是将数据结构和算法封装在一起形成对象,对象代表的是客观世界中的某个具体事物。面向对象编程的程序结构为:
对象 = (数据结构 + 算法)
程序 = 对象 + 对象 + 对象 + … + 对象
对象封装的目的在于将对象的使用者和设计者分开。使用者只需了解接口,而设计者的任务是决定如何封装一个类,哪些内容需要封装在类的内部及需要为类提供哪些接口。
总之,面向对象程序设计方法是一种以对象为中心的程序设计方式。它包括以下几个基本概念:抽象、对象、类和封装、继承、多态性、消息、结构与关联。
人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。抽象就是抽出事物的本质特征而暂不考虑它们的细节。图3-1所示为抽象概念。
从现实世界存在的不同实体如长方形、正方形、椭圆形等抽取它们的共性——形状(Shape)的特性。
图3-1 抽象概念
对象(Object)是客观世界存在的具体实体,具有明确定义的状态和行为。对象可以是有形的,如一本书、一辆车等。也可以是无形的规则、计划或事件,如记账单、一项记录等。
对象是封装数据结构及可以施加在这些数据结构上的操作的封装体。属性和操作是对象的两大要素。属性是对象静态特征的描述,操作是对象动态特征的描述,也称方法或行为,如图3-2所示学生对象。
类(Class)是一组有共同特性的所有对象成员的抽象描述。例如一个学生类可以用来描述教务系统中所有注册学生的学生对象。一个类包含一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。它包括属性和方法,如图3-3显示的是学生类图。
图3-2 学生对象
图3-3 学生类图
注意事项 面向对象程序设计的重点是类的设计,而不是对象的设计。
封装是一种信息隐蔽技术。它体现于类的说明,是对象的重要特性。通过封装把对象的实现细节对外界隐藏起来了。它具有两层含义。
①封装:把对象的属性和方法结合在一起,形成一个不可分割的独立单位。
②信息隐藏:尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。
继承是面向对象编程中的重要特征之一。它允许通过继承一个已经存在的类,编写一个新类。已有的类称为父类或基类,新类称为子类或派生类。子类自动共享父类的属性和方法。这些属性和方法不需要在子类中重复定义,大大提高了代码的复用性。同时,继承还具有传递性,例如B类继承了A类,C类继承了B类,则C类同时拥有A类和B类的属性和方法。继承关系如图3-4所示。
图3-4 继承关系
图中子类Square继承了父类Rectangle的特性,同时又具有自身新的属性和方法。
子类和父类是相对而言的。如哺乳动物是一般类(称为基类、超类或父类),狗和猫是特殊类(也称子类);在狗和黑狗之间,狗是一般类,黑狗是特殊类。
多态性是指不同类型的对象接收相同的消息时产生不同的行为。这里的消息主要是对类中成员函数的调用,而不同的行为就是指类成员函数的不同实现。当对象接收发送给它的消息时,根据该对象所属的类动态选用在该类中定义的实现算法。
向某个对象发出的服务请求称作消息。对象提供服务的消息格式称作消息协议。
消息包括被请求的对象标识、被请求的服务标识、输入信息和应答信息。
例如,向正方形类(Square类)的对象square发送消息,要求调用drawShape()方法的代码为square.drawShape()。
结构与关联体现系统中各个对象间的关系。主要包括部分/整体、一般/特殊、实例连接、消息连接等。
对象之间存在部分与整体的结构关系。该关系有两种方式:组合和聚集。组合关系中部分和整体的关系很紧密。聚集关系中则比较松散,一个部分对象可以属于几个整体对象。图3-5为组合关系。
图3-5 组合关系
一般/特殊:对象之间存在着一般和特殊的结构关系,也就是说它们存在继承关系。很多时候也称作泛化和特化关系,图3-5为继承关系。
实例连接:实例连接表现对象之间的静态联系。它通过对象的属性来表现对象之间的依赖关系;对象之间的实例连接称作链接,对象类之间的实例连接称作关联。
消息连接:消息连接表现对象之间的动态联系。它表现这样一种联系:一个对象发送消息请求另一个对象的服务,接收消息的对象响应消息,执行相应的服务。