面向对象的编程ppt

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

面向对象的编程欢迎来到Java课堂!软工2班黄明1.什么是面向对象软件工程学家Codd和Yourdon认为:面向对象=对象+类+继承+通信如果一个软件系统采用这些概念来建立模型并予以实现,那么它就是面向对象的。2.面向对象的基本概念-对象对象:对象从不同的角度有不同的含义,我们针对系统开发来讨论对象的概念,其定义是:对象(Object)是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。在这里,属性和服务是构成对象的两个基本要素,其定义是:属性是用来描述对象静态特征的一个数据项。服务是用来描述对象动态特征(行为)的一个操作序列。类的三大特点3.面向对象的基本概念--类把众多的事物归纳并划分成一些类是人类在认识客观世界时经常采用的思维方法,分类的原则是抽象,从那些与当前目标有关的本质特征中找出事物的共性,并将具有共同性质的事物划分成一类,得出一个抽象的概念。例如:人、房屋、树木等都是一些抽象的概念,它们是一些具有共同特征的事物的集合,称为类。类的概念使我们能对属于该类的全部个体事物进行统一的描述,树具有树根、树干、树枝和树叶,它能进行光合作用,这个描述适合所有树,而不必对每一棵具体的树进行描述。类的三大特点:封装、继承、多态4.面向对象的基本概念—封装封装(Encapsulation)是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。封装是面向对象方法的一个重要原则,系统中把封装看成是属性和对象的结合体,使对象能够集中而完整地描述一个具体事物。封装的信息隐蔽作用反映了事物的相对独立性,当我们从外部观察对象时,只需要了解对象所呈现的外部行为(即做什么),而不必关心它的内部细节(即怎么做)。与封装密切相关的概念是可见性,它是指对象的属性和服务允许对象外部存取和引用的程度。在软件上,封装要求对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的交叉感染,使软件错误能够局部化,大大减少了查错和排错的难度。另外,当对象内部需要修改时,由于它只通过少量的服务接口对外提供服务,便大大减少了内部修改对外部的影响,即减少了修改引起的波动效应。4.面向对象的基本概念—封装副作用:封装也有副作用,如果强调严格的封装,则对象的任何属性都不允许外部直接存取,因此就要增加许多没有其他意义、只负责读或写的服务,从而为编程工作增加了负担,增加了运行开销。为了避免这一点,语言往往采取一种比较灵活的做法,即允许对象有不同程度的可见性。5.面向对象的基本概念—继承继承对于软件复用是十分有益的,如果将OO方法开发的类作为可复用构件,那么在开发新系统时可以直接复用这个类,还可以将其作为父类,通过继承而实现复用,从而大大扩展了复用的范围。5.面向对象的基本概念—继承继承(Inheritance)是指子类可以自动拥有父类的全部属性和服务。继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。继承简化了人们对现实世界的认识和描述,在定义子类时不必重复定义那些已在父类中定义过的属性和服务,只要说明它是某个父类的子类,并定义自己特有的属性和服务即可。一个类可以是多个父类的子类,它从多个父类中继承了属性与服务,这称为多继承(MultipleInheritance)。举例:客轮既是一种轮船,又是一种客运工具,它可以继承轮船和客运工具这两个类的属性和服务。继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。5.面向对象的基本概念—继承6.面向对象的基本概念—多态多态性(Polymorphism)是指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为。在体现一般与特殊关系的一个类层次结构中,不同层次的类可以共享一个操作,但却有各自不同的实现。当一个对象接收到一个请求时,它根据其所属的类,动态地选用在该类中定义的操作。举例:在父类几何图形中定义了一个服务绘图,但并不确定执行时绘制一个什么图形。子类椭圆和多边形都继承了几何图形类的绘图服务,但其功能却不相同:一个是画椭圆,一个是画多边形。当系统的其他部分请求绘制一个几何图形时,消息中的服务都是绘图,但椭圆和多边形接收到该消息时却各自执行不同的绘图算法。注:多态性机制不但为软件的结构设计提供了灵活性,减少了信息冗余,明显提高了软件的可复用性和可扩充性。多态性的实现需要OOPL提供相应的支持,与多态性实现有关的语言功能包括:重载(overload)、动态绑定(dynamicbinding)、类属(generic)。内部类内部类:1.内部类的分类:成员内部类、静态嵌套类、方法内部类、匿名内部类。2.内部类的定义:放在一个类的内部的类。3.作用:1可以很好的实现隐藏;2拥有外围类的所有元素的访问权限;3可以实现多重继承;4可以避免修改接口而实现同一类中两种同名方法的调用。匿名内部类:1.定义:没有名字的内部类。2.使用原则:1不能有构造方法;2不能定义任何静态成员,静态方法。3不能是public、protected、private、static;4只能创建匿名内部类的一个实例。面向对象设计原则面向对象设计原则:1.单一职责原则(单一功能原则);2.开闭原则;3.里氏替换原则;4.接口分离原则;5.依赖倒置原则;6.迪米特法则(最少知道原则);7.优先使用组合而不是继承原则。单一职责原则(单一功能原则)定义:规定一个类应该只有一个发生变化的原因。(高内聚、低耦合)作用:用于控制类的粒度大小。核心:解耦和增强内聚性。好处:提高内聚、降低耦合。总结众所周知,面向对象编程语言可以提高程序的封装性、复用性、可维护性,但仅仅是“可以”。能不能实现OOPL的这些优点,要看具体怎么做。如果一个类的代码非常混乱,各种功能的代码都混在一起,封装性、复用性、可维护性无从谈起。SRP是所有原则中最简单的,也是最基本的一个。运用这个原则,可以提高类的内聚性,有助于充分发挥面向对象编程语言的优势。个人观点:该原则可以有效降低耦合,减少对不必要资源的引用。但后果是造成源文件增多,给管理带来不便,所以在实际应用中,可以对经常使用或经常需要改动的模块应用该原则。开闭原则1.定义:指的是软件实体对被扩展开放,对修改关闭。(设计一个模块时,应对使这个模块可以在不被修改的前提下被扩展)。2.实现开闭原则的关键:抽象化(抽象层)。3.满足开闭原则软件系统的优越性:1通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。2已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。3这样的系统同时也满足了可复用性与可维护性。应用:高级语言中的接口与虚拟类。好处:提高灵活性、可重用性、可维护性。总结:实现开闭原则的关键是抽象!抽象层相对稳定,不需修改,需求变化后通过重新定义抽象层的新实现来完成。实现:实现开闭原则的关键是抽象,抽象是面向对象设计的一个核心特征。对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考,这降低了思考的复杂度,不用同时考虑太多的东西。定义一个抽象层,只规定功能而不提供实现,实现通过定义具体类来完成。当需求变化时,不是通过修改抽象层来完成,而是通过重新定义抽象层的新实现来完成,即通过扩展来完成。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。这样一来,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需修改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。即使无法百分之百的做到“开-闭”原则,但朝这个方向努力,可以显著改善一个系统的结构。另一方面,对于系统的每个部分都肆意地进行抽象也不是一个好主意,应该仅仅对程序中需求频繁变化的部分进行抽象。拒绝不成熟的抽象和抽象本身一样重要。里氏替换原则:定义:所有引用基类的地方必须能透明的使用其子类的对象。(其子类对象能代替父类对象,但其父类对象不能代替子类对象。)好处:里氏替代原则是对开闭原则的扩展。如果要采用开闭原则必然用到抽象和多态,而这又离不开继承,里氏替代原则就是对如何良好继承提出了要求。总结:里氏替代原则是对开闭原则的扩展。1.“开-闭”原则与依赖倒转原则是目标和手段的关系。2.里氏代换原则是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。接口分离原则:定义:客户端不应该依赖它不需要的接口;应用:一个类对另一个类的依赖应该建立在最小的接口上。结论:使用多个专门的接口比使用单一的接口要好。如何实现接口隔离原则?(不应该强迫用户依赖于他们不用的方法。)1、利用委托分离接口。2、利用多继承分离接口。依赖倒置原则:1.解释说明:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。2.传递依赖关系的方式:接口传递、构造方法传递、setter方法传递。3.应用:要依赖抽象,不要依赖于具体。即针对接口编程,不要针对实现编程。4.关系:里氏代换原则是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。迪米特法则(最少知道原则):顾名思义,就是一个对象对其他对象保持最少的了解。类与类之间的关系目标:掌握类和类之间依赖、关联、聚合、组合关系依赖关系:定义可以简单的理解,类A依赖于类B就是类A使用到了类B,类B的变化会影响到类A这种关系一般是偶然性的、临时性的、非常弱的依赖关系总是单向的表现在代码层面,类B作为参数或局部变量被类A在某个method方法中使用,此时类A依赖于类BUML表示类A依赖于类B,用由类A指向类B的带箭头虚线表示耦合(或者依赖)关系的种类:1.零耦合(NilCoupling)关系:两个类没有耦合关系2.具体耦合(ConcreteCoupling)关系:发生在两个具体的(可实例化的)类之间,经由一个类对另一个具体类的直接引用造成。3.抽象耦合(AbstractCoupling)关系:发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的类之间存有最大的灵活性。classPet{//宠物类}classMaster{//主人类publicvoidfeed(Petpet){//给宠物喂食}}举例:关联关系:定义关联是类和类之间的一种强依赖关系这种关系一般具有长期性关联可以是单向、双向的关联可分为一对一关联、一对多关联、多对多关联表现在代码层面被关联类B以类的属性形式出现在关联类A中关联类A引用了一个类型为被关联类B的全局变量UML表示用带箭头实线表示,箭头指向被关联类若是双向关联,实线两端可不带箭头举例:classCourse{//课程类privateintcid;//课程编号privateStringname;//课程名}classStudent{//学生类privateintsid;//学号privateStringname;//姓名privateStringdepartment;//系别privateCourse[]course;//所选课程}聚合关系:定义关联关系的一种特例体现的是整体与部分的关系,即has-a的关系,整体与部分之间可分离,具有各自的生命周期比如计算机与CPU、公司与员工、班级和学生、比如航母编队包括航空母舰、驱护舰艇、舰载飞机等表现在代码层面,和关联关系是一致的,只能从语义级别来区分UML表示以空心菱形加实线箭头表示。(有些设计软件如visio中,实线不带箭头)举例:classEmployee{//员工类privateStr

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功