
5.1 面向对象

面向对象是一种现在最为流行的程序设计方法,现在的程序开发几乎都是以面向对象为基础。但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对自己来解决问题。面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,并不考虑项目的维护性。面向对象,更多的是要进行子模块化的设计,每一个模块都需要单独存在,并且可以被重复利用,所以,面向对象的开发更像是一个具备标准的开发模式。
提示:关于面向过程与面向对象的区别。
考虑到读者暂时还没有掌握面向对象的概念,所以本书先使用一些较为直白的方式帮助读者理解面向过程与面向对象的区别,例如,如果说现在要想制造一把手枪,则可以有两种做法。
做法1(面向过程):将制造手枪所需的材料准备好,由个人负责指定手枪的标准,例如,枪杆长度、扳机设置等。但是这样做出来的手枪,完全只是为一把手枪的规格服务,如果某个零件(例如扳机坏了)需要更换的时候,那么就须首先清楚这把手枪的制造规格,才可以进行生产,所以这种做法没有标准化和通用性。
做法2(面向对象):首先由一个设计人员,设计出手枪中各个零件的标准,并且不同的零件交给不同的制造部门,各个部门按照标准生产,最后统一由一个部门进行组装,这样即使某一个零件坏掉了,也可以轻易地进行维修,这样的设计更加具备通用性与标准模块化设计要求。
面向对象的程序设计有3个主要特性:封装性、继承性和多态性。下面简单介绍一下这3种特性,在本书后面的内容中会对这3个方面进行完整的阐述。
1.封装性
封装是面向对象的方法所应遵循的一个重要原则。封装具有两个含义:一是指把对象的成员属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(对象)中。另一层含义是指“信息隐蔽”,把不需要让外界知道的信息隐藏起来。有些对象的属性及行为允许外界用户知道或使用,但不允许更改;而另一些属性或行为,则不允许外界知晓,或者只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。
封装机制在程序设计中表现为,把描述对象属性的变量与实现对象功能的方法组合在一起,定义为一个程序结构,并保证外界不能任意更改其内部的属性值,也不能任意调动其内部的功能方法。
封装机制的另一个特点是,给封装在一个整体内的变量及方法规定了不同级别的“可见性”或访问权限。
2.继承性
继承是面向对象的方法中的重要概念,是提高软件开发效率的重要手段。
首先继承拥有反映事物一般特性的类;其次在其基础上派生出反映特殊事物的类。如已有汽车的类,该类中描述了汽车的普遍属性和行为,进一步再产生轿车的类,轿车的类是继承于汽车的类,轿车的类不仅拥有汽车的类的全部属性和行为,还增加轿车特有的属性和行为。
在Java程序设计中,对于继承实现前一定要有一些已经存在的类(可以是自定义的类或者由类库所提供的类)。用户开发的程序类需要继承这些已有的类。这样,新定义的类结构可以继承已有类的结构(属性或方法)。被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。根据继承机制,派生类继承了超类的所有内容,并相应地增加了自己的一些新的成员。
面向对象程序设计中的继承机制,大大增强了程序代码的可重复使用性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序的修改扩充提供了便利。
若一个子类只允许继承一个父类,称为单继承;若允许继承多个父类,则称为多继承。目前Java程序设计语言不支持多继承。而Java语言通过接口(interface)的方式来弥补由于Java不支持多继承而带来的子类不能享用多个父类的成员的缺憾。
3.多态性
多态是面向对象程序设计的又一个重要特征。多态是指允许程序中出现重名现象,Java语言中含有方法重载与对象多态两种形式的多态。
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行相互的转换,而且根据其使用的子类的不同完成的功能也不同。
多态的特性使程序的抽象程度和简洁程度更高,有助于程序设计人员对程序的分组协同开发。