一、面向对象
面向对象
面向对象的设计思想是按照人类习惯的思维方法建立问题域的模型;或者说,尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法和过程,即使得问题域与求解域在结构上尽可能一致。
也就是使我们分析、设计、实现一个系统的方法尽可能地接近我们认识一个系统的方法。很好地解决面向过程不能清楚表述的复杂系统。面向对象的问题求解包括:
a.面向对象的分析(OOA,Object-Oriented Analysis)
b.面向对象的设计(OOD,Object-Oriented Design)
c.面向对象的编程(OOP,Object-Oriented Programming)
面向过程与面向对象区别:
面向过程,以算法为核心,先确定算法再确定数据结构;习惯于建立数据结构存放数据,并定义函数(方法)来操作数据;应用程序单一,即所有功能都包含在几个代码模块中(常常是一个代码模块)。
面向对象,以对象为核心,先确定数据结构再确定算法;习惯于构造一个对象模型,将数据与方法组织在一起;常常要使用很多模块,每个模块都提供特定的功能,每个模块都是孤立的,甚至与其他模块完全独立。由类,对象,抽象,封装,继承,多态等特征构成,可以自定义数据类型。
掌握OOP的难点,在于思想的转换。我们习惯于考虑解决问题的方法,而不是考虑将问题抽象成模型再解决。
二、抽象
抽象是科学研究中常用的一种思维方法,即指从特定角度出发,从研究的事物中抽取与研究主旨有关的实质性内容或我们所关注的特性,形成一个新的事物的思维过程。
1.面向过程语言中的过程抽象:是将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。
2.面向对象语言中的数据抽象:是把系统中要处理的数据和这些数据的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包含了数据的操作,更为严格、合理。
抽象是一种由具体到抽象、由复杂到简洁的思维方式,包括下面三个层次:
1)从问题领域的事物到软件模型中对象的抽象;
在建立对象模型时,分析问题领域中的实体,把它抽象为对象。
2)对象到类的抽象;
在建立对象模型时,把具有相同属性和功能的对象抽象为类。
3)从子类到父类的抽象;
当一些类之间具有相同的属性和功能时,把这部分属性和功能抽象到一个父类中。
三、问题领域
问题领域,是指软件系统所模拟的真实世界中的系统。
随着计算机技术的发展和普入,软件系统渗透到社会的各个方面,几乎可用来模拟任意一种问题领域。
如学校、医院、商场、电影摄制组和太阳系等。
四、对象
对象是对问题领域中事物的抽象!面向对象技术的核心所在。对象具有如下特征:
1)万事万物皆为对象;
问题领域中的实体和概念都可以抽象为对象。
2)每个对象都是唯一的;
对象的惟一性来自于真实世界中事物的惟一性。
3)对象具有属性和行为;
对象的行为包括具有的功能及具体的实现。在建立对象模型时,只关注对象有什么样的功能,而不需要考虑如何实现这些功能。
对象的属性用成员变量表示,对象的行为用成员方法表示。
4)对象具有状态;
状态是指某个瞬间对象的各个属性的取值。对象的某些行为往往会改变对象自身的状态,即属性的取值。
5)对象都属于某个类,每个对象都是某个类的实例。
----《孙卫琴 Java面向对象编程》
以面向对象的观点看来,所有的面向对象的程序都是由对象来组成的,这些对象首先是自治的、同时它们还可以互相通信、协调和配合,从而共同完成整个程序的任务和功能。
五、类
类是一组具有相同属性和行为的对象的抽象,简单地说,类是同种对象的抽象。
类及类的关系构成了对象模型的主要内容。面向对象编程的主要任务就是定义对象模型中的各个类。
类是对象的篮图或模型,对象是类的实例。实例化一个类就是为该类创建一个对象。
同一个类的所有实例具有相同属性;
同一个类的所有实例包括类本身的所有实例及其子类的所有实例。
对象从类中产生出来!从类中创建出来的对象就拥有该类集成的所有属性与方法。
对象模型中的类实际上就是一种抽象的数据类型,是由程序员自定义的数据类型。是拥有相关的属性与方法的类型。
类是面向对象程序中最基本的程序单元。
类之间的关系:
use-a:依赖关系
has-a:聚合关系
is-a :继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法(个性存在于共性中)。
六、封装
封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。这是面向对象的基本思想之一,信息隐蔽!
使用封装的优点:
1)便于使用者正确,方便地理解和使用系统,防止使用者错误修改系统的属性。
2)有助于建立各个系统之间的松耦合关系,提高系统的独立性。
3)提高软件的可重用性,每个系统都是一个相对独立的整体,可以在多种环境中得到重用。
4)降低了构建大型系统的风险,即使整个系统不成功,个别的独立子系统有可能依旧是有价值。
一个设计良好的系统会封装所有的实现细节,把它的接口与实现清晰地隔离开来,系统之间只通过接口进行通信。面向对象的编程语言主要通过访问控制机制来进行封装,这种机制能控制对象的属性和方法的可访问性。
在Java语言中提供了以下4种访问控制级别。
public:对外公开,访问级别最高;
protected:只对同一个包中的类或者子类公开;
默认:只对同一个包中的类公开;
private:不对外公开,只能在对象内部访问,访问级别最低。
哪些属性和方法该公开,哪些该隐藏呢?封装的两个大致原则:
1)把尽可能多的东西藏起来,对外提供简捷的接口。
系统的封装程度越高,那么它的相对独立性就越高,使用就更方便。
2)把所有属性藏起来。
透明:对象封装实现细节,也就意味着对象的实现细节对使用者是透明的。
透明在此处应该理解为"看不见"。正如透明的玻璃窗让人感觉不到它的存在一个道理。
七、继承 (泛化)
继承描述对象共性与个性的关系,或者说一般与特殊的关系。符合人类认识事物的规律,由具体(特殊)到一般再到具体的过程。子类继承了父类的属性和方法,同时,子类中还可以扩展出新的属性和方法,并且还可以覆盖父类中方法的实现方式。覆盖是指在子类中重新实现父类中的方法。
方法重载(Overload):子类、父类的方法名相同,但参数类型或个数不同。
方法覆盖(Override):子类、父类的方法名相同,同时参数类型或个数也相同。
八、多态
多态的实质:当系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务,而这一切对系统A是透明的。
多态强调使用一般化的操作,抽取共性,在程序中忽略具体对象型别的细节,即形式上调用父类的方法,但实际上通过运行期识别技术仍调用各自子类的方法;使用多态技术使得程序可扩充、可重用并且容易维护;多态与继承、向上转型、动态绑定、运行期识别技术紧密相关。
抽象机制,是开发人员在开发过程中使用的机制;
动态绑定、运行期识别机制,是Java虚拟机运行时提供的机制。
抽象机制和动态绑定机制能共同提高系统之间的松耦合性。
九、接口、抽象类
在Java语言中,接口有两种意思:一是指概念性的接口;二是指程序中的接口类型。
1)概念性的接口:
即指系统对外提供的所有服务,在对象中表现为Public类型的方法的声明。
既然每个对象都是服务提供者,如何对外提供服务呢?对象通过接口对外提供服务。
接口是一个抽象的概念,是指系统对外提供的所有服务。系统的接口描述系统能够提供哪些服务,但是不包含服务的实现细节。
接口是提高系统之间松耦合的有力手段;接口也提高了系统的可扩展性。
2)接口类型
指用interface关键字定义的实实在在的接口,它用于明确地描述系统对外提供的所有服务,它能够更加清晰地把系统的实现细节与接口分离。接口只做形式定义,不含实现细目,所有接口定义的方法必须Public。
在Java语言中abstract class 和 interface区别:
abstract class 和 interface 是 Java语言中的两种定义抽象类的方式,它们之间有很大的相似性,但是区别很大。
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
十、消息,服务
消息就是要求某个对象执行其内的某个操作的规格说明,一个消息包含三部分:
.接收消息的对象(对象名)
.消息选择符(消息名)
.零个或多个变元(参数)
软件系统的复杂功能是由各种对象协同工作来共同完成的。每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其他对象提供的服务。
一个对象为了获得另一个对象的服务,需要向那对象提出获得特定服务的请求,提出请求的过程被称为发送消息。对象提供的服务是由对象的方法来实现的,因此发送消息实际上也就是调用一个对象的方法
从使用者角度出发,整个软件系统就是一个服务提供者。操作软件系统的用户是系统的边界。
在UML语言中,系统边界被称为角色(Actor)。在系统内部,每个子系统(对象或对象的组合)也都是服务提供者,它们为其他子系统提供服务,子系统之间通过发送消息来互相获得服务。一个孤立的不对外提供任何服务的系统是没的任何意义的。
十一、聚集 Aggregation、组合 Compositon
聚集(Aggregation)是一种特殊形式的关联。聚集表示类之间的关系是整体与部分的关系。一辆轿车包含四个车轮、一个方向盘、一个发动机和一个底盘,这是聚集的一个例子。在需求分析中,"包含"、"组成"、"分为……部分"等经常设计成聚集关系。
聚集可以进一步划分成共享聚集(Shared Aggregation)和组成。例如,课题组包含许多成员,但是每个成员又可以是另一个课题组的成员,即部分可以参加多个整体,我们称之为共享聚集。另一种情况是整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失,这称为组成(Composition)。例如,我们打开一个视窗口,它就由标题、外框和显示区所组成。一旦消亡则各部分同时消失。在UML中,聚集表示为空心菱形,组成表示为实心菱形。
十二、面向对象编程的3个原则
封装(encapsulation)、继承(inheritance)、多态性(polymorephism)
封装:将代码及其处理的数据捆绑在一起的一种机制;
继承:一个对象获得另一个对象的属性的过程;
多态性:一个接口,多种方法。
参考来源:
《软件工程》清华大学 张海潘
http://hi.baidu.com/jhayumu/blog/item/3b5ae108ace048d462d98658.html