目录
面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型,它取代了20世纪70年代的“结构化”或过程式编程技术。由于Java是面向对象的,所以必须熟悉OOP才能够很好地使用Java。
面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能和隐藏的实现。程序中的很多对象是来自标准类库的“成品”,还有一些是自定义的。究竟是自己构造对象,还是从外界购买,这完全取决于开发项目的预算和时间。但是,从根本上说,只要对象能够满足要求,就不必关心其功能到底是如何实现的。
一、类
类(class)指定了如何构造对象。可以将类想象成制作小甜品的模具,将对象想象为小甜饼。由一个类构造(construct)对象的过程称为这个类的实例(instance)。
标准Java库中提供了几千个类,可用于各种目的,如用户界面设计、日期和日历,以及网络编程。还有自行创建的类,来描述需求应哟相应问题领域中的对象。
封装(encapsulation,有时称为信息隐藏)是处理对象的一个重要概念。从字面意思看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现细节。
实现封装的关键在于,绝不能让其他类中的方法直接访问这个类的实例字段。程序只能通过对象的方法与对象数据进行交互。封装为对象赋予了"黑盒"特性,这有利于提高重用性和可靠性。
OOP的另一个原则会让用户自定义Java类变得更为容易,就是可以通过扩展其他类来构建新类。Java提供类一个“超类”,名为Object,所有其他类都扩展至Object
扩展一个已有的类时,这个新类具有被扩展的那个类的全部属性和方法,只需要在新类中提供适用于这个新类的新方法和实例字段。通过扩展一个类来得到另外一个类的概念称之为继承(inheritance)。
二、对象
使用OOP,一定要清楚对象的三个主要特性:
同一个类的所有示例对象都有一种家族相似性,它们都支持相同的行为。一个对象的行为由所调用的方法来定义。
每个对象都会保存着描述当前状态的信息,这就是对象的状态。对象状态的改变必然是调用方法的结果(如果不经过方法的调用就可以改变对象状态,这说明破坏了封装性)。
对象的状态并不能完全描述一个对象,因为每个对象都有一个唯一的标识(identity,或称身份)。需要注意,作为同一个类的实例,每个对象的标识总是不同的,状态通常有所不同。
对象的这个关键特性会彼此相互影响。例如,对象的状态会影响它的行为(如果一各订单"已发货"或"已付款",就应该拒绝要求增删商品的方法调用。反过来,如果订单是“空的”,即还没有订购任何商品,就不应该允许"发货")。
三、识别类
传统的过程式程序中,必须从最上面的main函数开始编写程序。设计一个面向对象系统时,则没有所谓的“最上面”。因此,学习OOP的初学者常常会感觉无从下手。答案是:先从识别类开始,然后再为各个类添加方法。
识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应动词。
例如,在订单处理系统中,有这样一些名词:
接下来查找动词。商品要添加(add)到订单中,订单可以发货(ship)或取消(cancel),另外可以对订单完成付款(apply)。对于每一个动词,如“添加”“发货”“取消”或者“完成付款”,要识别出负责完成相应动作的对象。例如,当一个新商品添加到订单中时,订单对象就是负责的对象,因为它知道如何存储商品以及如何对商品进行排序,也就是说,add应该是Order类的一个方法,它接收一个Item对象作为参数。
四、类之间的关系
依赖(dependence),即“uses-a”关系,是一种最明显的也最一般的关系。例如,Order类使用了Account类,因为Order对象需要访问Account对象来查看信用状态。但是Item类不依赖于Account类,因为Item对象不需要考虑客户账户。因此,如果一个类的方法要使用或操作另一个类的对象,我们就说前一个类依赖于后一个类。
应当尽可能减少相互依赖的类。这里的关键是,如果类A不知道B的存在,它就不会关心B的任何改变(这意味着B的改变不会在A中引入bug)。用软件工程的术语来说,就是要尽可能减少类之间的耦合(coupling)。
聚合(aggregation),即“has-a”关系,很容易理解,因为这种关系很具体。例如,一个Order对象包含一些Item对象。包含关系意味着类A的对象包含类B的对象。
继承(inheritance),即“is-a”关系,表示一个更特殊的类与一个更一般的类之间的关系。例如,Rushorder类继承了Order类。在特殊化的RushOrder类中包含一些用于优先处理的特殊方法,还提供了一个计算运费的不同方法;而其他的方法,如添加商品、生成账单等都是从Order类继承来的。一般而言,如果类D扩展了类C,类D会继承类C的方法,另外还会有一些额外的功能。