1.59k likes | 1.69k Views
面向对象程序设计概述. 过程式程序设计. OOP 程序设计. 消息. 函数. 函数. 函数. 函数. 方法. 方法. 方法. 方法. 数据. 数据. 程序设计方法. 公共数据. 算法+数据结构. 对象+消息. 程序设计方法. 面向过程的程序设计 面向过程的程序遵循面向过程的问题求解方法 其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决过程。 算法+数据结构 数据结构利用计算机的离散逻辑来量化表达需要解决的问题 。 而算法则研究如何快捷、高效地组织解决问题的具体过程。 面向过程——面向机器. 程序设计方法.
E N D
过程式程序设计 OOP程序设计 消息 函数 函数 函数 函数 方法 方法 方法 方法 数据 数据 程序设计方法 公共数据 算法+数据结构 对象+消息 面向对象编程
程序设计方法 • 面向过程的程序设计 • 面向过程的程序遵循面向过程的问题求解方法 • 其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决过程。 • 算法+数据结构 • 数据结构利用计算机的离散逻辑来量化表达需要解决的问题 。 • 而算法则研究如何快捷、高效地组织解决问题的具体过程。 • 面向过程——面向机器 面向对象编程
程序设计方法 • 面向对象的程序设计 • 面向对象问题求解关心的不仅仅是孤立的单个过程,而是孕育所有这些过程的母体系统 • 它能够用计算机逻辑来模拟、描述系统本身,包括系统的组成,系统的各种可能状态,以及系统中可能产生的各种过程与过程引起的系统状态切换。 • 面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。 • 对象是一种看问题的观点,是对现实世界各种元素的一种抽象。对象既含数据又含功能,因此具有自身处理数据的能力。对象被认为是迄今为止最接近真实事物的数据抽象。 面向对象编程
对象与过程 • 考虑对象 — 考虑过程 :前者更有意义 • 设计对象 —设计过程:前者更富挑战性,尤其是设计可重用的对象。 • 面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。 面向对象编程
对象的几个特征 • Everything is an object • 原则上,可以将所要解决的问题中的任何一个 “概念组件”在程序中表示为一个对象。 • 对象类似一个记录,可以存储数据,但你还可以让它执行某些操作(作用在它自身的数据上) • A program is a bunch of objects telling each other what to do by sending messages • 所谓 对一个对象发信息,就是调用该对象的一个方法。 • Every object has a type • each object is an instance of a class • 对象+消息 面向对象编程
现实中的对象 • 现实世界中对象有两个共同的特点: • 一方面,它们都有自己的状态,如一台电 视机有自己的摆放位置,有关机和开机状 态,此刻正在播放某一频道的电视节目等 • 另一方面,它们又都有自己的行为或功能, 如电视机的开机、关机、调台等。 面向对象编程
对象的属性与方法 • 面向对象程序设计中的对象是现实世界对象的模型化,它同样具有状态和行为。 • 对象的状态用属性来维护, • 对象的行为用方法来实现。 • 因此可以简单地讲,对象是面向对象的程序设计模式,它由描述状态的属性(变量)和用来实现对象行为的方法(代码)组成。 • 几种叫法 • 属性 — 静态属性 — 域 —成员变量 状态 • 方法 — 动态属性 — 成员方法 行为 面向对象编程
案例-定单系统 • 成立新的公司—时尚服装。 • 每月发布商品编目,并寄给定户。 • 客户可以发e-mail 或FAX定货(寄定单)。 • 对于客户的定货要检查存货清单,如缺货,得暂时搁置定单,直到供货商送到货。 • 公司检查支票和信用卡。 • 公司将定单下发给仓库,给客户发货。 • 注意: • 同种商品每月价格不一。如果订户使用的是六个月之前的编目,价格采用当前编目价格。 • 公司接受所有主要的信用卡。 面向对象编程
分析对象 • 系统是由相互作用的对象组成。任何系统需要它的对象做它的工作。 • 案例对象:定单,服装,客户… • 在一个问题域中识别对象不是科学而是艺术。对象取决于人的观点(模块化,应用) • 从“名词”开始确定系统中的对象。对象可以是: • 简单的和复杂的:衬衣,银行 • 实际的和概念的:银行出纳员,银行帐号 面向对象编程
对象的属性和方法 • 确定对象的属性和方法 • 对象属性:可以是数据或对象。 • 客户——客户号,客户名,地址… • 定单——定单号,定货条目,顾客号(也可以是顾客对象)。 • 对象方法:让对象做的事情(可以对自己,也可以对其他对象),经常影响对象属性。 • 客户—提交定单… • 定单—打印定单,改变条目… 面向对象编程
Order orderID Customer dateOrdered itemsOrdered payment placedBy initialize() calcAmountOwed() printOrder() makePayment() changeItem() Customer CustomerID name billingAddress shipping Address phone initialize() placeOrder() 模型化对象 面向对象编程
测试对象 • 与问题域是否有关、适当? • 是否独立存在 客户可以独立存在。 定单可以,但在使用时必须有客户配合。 • 是否有属性和方法。 面向对象编程
对象与类 • 类(Class)是同种对象的集合与抽象 • 类是对象的抽象及描述,它是具有统一属性和方法的多个对象的统一描述体,是用来定义一组对象共有属性和方法的模板。 • 类是用来创建对象实例的样板,它包含所创建对象的状态描述和方法的定义。类是一个型,而对象则是这个型的一个实例。 • 类是静态概念,而对象则是一个动态概念,因为只有在运行时才给对象分配空间,对象才真正存在。 面向对象编程
对象是类的唯一性实例 计算机世界 现实世界 映射 实体 对象 实例化 抽象 抽 象 计算机逻辑 的实现 类 抽象数据类型 概念世界 面向对象编程
接口与实现 • 类是一种封装技术。 • 如果属性或方法被定义为public ,它就是接口的一部分,其他类可以直接访问它。 • 如果属性或方法被定义为private,它就是实现的一部分。只有类自己的方法可以访问它。 • 对象要注意保护自己的数据(私有属性,公有方法)。对象通过它们的方法管理,实现由编程人员控制。 • 通过接口与对象发生作用,内部实现不影响接口(汽车,内部变化不影响驾驶)程序一部分变化不会影响其他部分。 • 复用 • 事先写好的操作可在整个项目中使用 • 重用比重写更容易 面向对象编程
对象与类—几种相互关系 • 包含关系 • 当对象A是对象B的属性时,我们称对象B包含对象A。 • 关联关系 • 当对象A的引用是对象B的属性时,我们称对象A和对象B之间是关联关系。 • 类之间的继承关系 • B类继承了A类,就是继承了A类的属性和方法。 • A类称之为父类,B类称之为子类。 面向对象编程
为什么要学习面向对象编程 • 面向对象技术的意义 • 人脑与电脑的思维 • 如何解决软件危机 • 学习面向对象的紧迫性 • 现在已经到了如果不了解面向 对象编程,作为一个程序员就抬 不起头来的时候了。 面向对象编程
面向对象技术意义 • 目前的计算机功能很强,但目前的计算机并不很合理。最大的不合理是来自人认识问题时的认识空间和计算机处理问题时的方法空间的不 一致,人与目前的计算机之间仍存在着较大的隔阂。而面向对象技术有助于减小这一隔阂、并使这两个空间尽量趋于一致。 • 软件复用 • 类库的使用(可重用的标准化的模块) • 类的继承 • 面向对象技术应用的普遍性 面向对象编程
面向对象技术-人人受益 • for manager • 更迅速和更经济地开发和维护软件系统。 • for analysts and designers • 模块化的过程将变的简单,并能获得一个清晰的、易于管理的设计方案。 • for programmers • 清晰的对象模型,丰富的面向对象开发工具及类库使得编程变为一件饶有兴趣的工作。程序员明显感到编程效率的提高。 面向对象编程
主要内容 • 抽象 • 封装 • 继承 • 多态 • 类定义 • 重载 • 包 • 接口 面向对象编程
OOP的主要特点 • 抽象 • 去除对象中与主旨无关的次要部分,而 仅仅抽取出与研究有关的内容(数据抽象) 面向对象编程
抽象 • 在软件开发方法中使用的抽象有两类:过程抽象和数据抽象 • 过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤 • 数据抽象把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型包含了数据,也包含了针对这些数据的授权操作。面向对象的软件开发采用数据抽象的方法来构建程序的类、对象和方法。 面向对象编程
抽象 • 所有编程语言都提供“抽象”功能。 • 你所能解决问题的复杂程度取决于抽象的种类和质量。 • 汇编语言对于计算机(机器语言)是一步很小的抽象。 • 过程化语言(高级语言)相对于汇编语言的抽象迈了一大步。但你所考虑的仍然是机器的结构而非问题的结构。 • 面向对象方法为程序员提供了一种表示问题空间元素的全新的方法,且不受问题类型的约束。 面向对象编程
抽象 • 问题空间元素—>方法空间中的表示:对象 • “对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。 • 面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。 • 面向对象语言更加贴近人的思维方式。OOP允许你用问题空间中的术语来描述问题。 面向对象编程
OOP的主要特点 • 封装(encapsulation) • 实现了信息的隐藏及安全性 • 提高了程序的模块化,且易于维护 面向对象编程
封装-信息隐藏 • 封装 ─是一种组织软件的方法。其基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,使其相互关系隐藏在内部,而对外仅仅表现为与其他封装体间的接口。从而构造出具有独立含义的软件实现。 • 封装并不是一个新的概念,但在面向对象的程序设计中提出了一种全新的封装方法 ─ 类 面向对象编程
封装-信息隐藏 • 封装 ─ 就是利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能与这些抽象数据类型交流和交互。 • 在面向对象的程序设计中,抽象数据类型是用“类”来代表的。 面向对象编程
封装-信息隐藏 • 每个类里都封装了相关的数据和操作。在实际的开发过程中,类多用来构建系统内部的模块。 • 由于封装特性把类内的数据保护得很严密,模块与模块间仅通过严格控制的界面进行交互,使它们之间耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安全性。 面向对象编程
封装-软件复用 • 封装使得对象: • 对内成为一个结构完整、可自我管理、自 我平衡、高度集中的整体。 • 对外则是一个功能明确、接口单一、可在 各种合适的环境下都能独立工作的有机的 单元。 • 类的封装特性使得类可重用性大为提高,这样的有机单元特别适宜构建大型标准化的应用软件系统,可以大幅度地提高生产效率。 面向对象编程
汽车 车 Java仅支持单重继承,但可通过接口实现多重继承 火车 交通工具 船 子类 父类/超类 飞机 (subclass) (superclass) OOP的主要特点 • 继承(inheritance) • 体现了对现实世界的抽象模拟 • 提高了代码的复用性 面向对象编程
OOP的主要特点 • 多态(polymorphism) • 用同一个名字调用实现不同操作的方法 • 方式1:不同的类之间的同名方法 如:中国人/日本人/美国人 说话 • 方式2:参数不同的同名方法 • 使用方便,且降低了维护和编程量 面向对象编程
Java中的类 • 几个概念 • 类:同种对象的集合与抽象 • 系统类库中已定义好的类:是系统提供 的已实现的标准类的集合,是Java的API,它可帮助开发者方便、快捷地开发Java程序。 • 用户自定义的类 ─ 针对特定问题 • 子类、父类 面向对象编程
Java中的类 • Java中的类结构 • 基类:所有Java的类都派生自Object • Java的类可组织在包(package)中 • Java提供的标准类库分布在一系列的包中,如java.lang,java.util,java.net等 (参见 P.117) • 编程的过程就是继承基类或标准类而创建、定义特殊子类的过程 面向对象编程
父类 子类 在程序中定义你抽象出的类 • 新类必须在已有类的基础上构造。 • 在已有类的基础上构造新类的过程称为派生。 • 派生出的新类称为已有类的子类。已有类称为超类(父类)。 • 子类继承父类的属性和方法。 • 当没有显式指定父类时,父类隐含为java.lang包中的Object类。 面向对象编程
Java中类的声明 • 类说明语法: [ 类修饰符] class 类名 [ extends 父类名 ] [ implements 接口名 ] { 成员变量定义; 方法定义; } 类体 面向对象编程
Java中类的声明 • 类修饰符(Modifier): • public:允许其他类(没有限制)访问本类,一个 源文件仅可以有一个public类 • 缺省:可被当前包中的其他类访问 • abstract:没有实例的抽象概念类,是它的所有子类 的公共属性和公共方法的集合 • final:不能再被扩展,不能有子类的类;易于安全 性的实现,或用于创建固定功能的类 • 父类继承声明:extends父类名 • 实现接口(interface):implements接口名 面向对象编程
Java中类的声明 • 例: public abstract class shape{ …… } class rectangle extends shape{ …… } final class roundrect extends rectangle{ …… } 注意: final可以与abstract一起使用吗? 面向对象编程
创建对象 • 对象(实例instance):以类为模板创建的 具体实例(实际个体) • 创建某个类的具体对象(类似变量声明) 类名 欲创建的对象名=new 类名(参数表) ; 例如: String s = new String( “Hello!” ) ; 面向对象编程
类的成员变量的声明 • 声明成员变量(member)的语法 [修饰符] 数据类型 变量名; • 引用:对象名.变量名 • 修饰符 • 访问控制符 • public:可被所有其他类引用 • private:仅可被该类自身引用和修改,不能被其他任何类(包括该类的子类)引用,它提供了最高级别的保护。 面向对象编程
成员变量的声明 • protected:该类自身、子类、同一包中的其他类 • private protected:该类自身、子类 注:private protected仅1.0.2支持, 1.1之后不再支持 • 缺省:本包中的类 • static:类成员变量,对所有的实例一致,引用时前缀 可使用类名或对象名 • final:数值不变常量,定义同时应对其进行初始化 面向对象编程
成员变量的声明 • 例: class shape{ private protected int x; private protected int y; static final float MaxArea=100.0f; …… } 面向对象编程
成员变量的声明 class Employee { String name ; int age ; float salary ; } Employee e = new Employee( ) ; e.name=“张立” ; e.age=21; e.salary = 528.37F ; final 类型 常量名=值 实例变量—成员变量 其生命周期与对象存在的时间相同。 面向对象编程
类ex j k=10 对象1 i : 3 对象2 i : 5 类成员变量(静态变量) • 静态变量——为类的各实例共享的变量。 static 静态变量名; • 位于类的内存区域中,为该类的各个对象共享. • 无此限定符的变量是实例变量。 class ex { int i ; static int j ; static final int k=10 ; --- } • final 常量可同时定义为static 面向对象编程
类成员变量(静态变量) • 实现各实例之间的通讯 对于该类的任何一个对象访问该静态变量时,取得的都是相同的值 • 跟踪创建的实例数 public class Count { private int serial ; //实例变量 private static int counter = 0 ; //静态变量 public Count() { counter++; serial = counter ;} } • 静态变量类似于某些语言中的全局变量 面向对象编程
类成员变量(静态变量) • 非private 的静态变量无须创建实例就可以从类的外部访问。 class StaticVar { static int x=100 ; } public class test { public void m() { int m = StaticVar.x ; } } 面向对象编程
类成员变量(静态变量) class PhoneCard200 { static final String connectNumber = “200”; static double additoryFee; long cardNumber ; int password; boolean connected; double balance; … } 面向对象编程
类成员变量(静态变量) public class a { public static void main(String args[]) { PhoneCard200 my200_1 = new PhoneCard200(); PhoneCard200 my200_2 = new PhoneCard200(); PhoneCard200.additoryFee = 0.1; System.out.println(“第一张200卡的接入号码:” + my200_1.connectNumber); System.out.println(“第二张200卡的附加费: ” + my200_2.additoryFee); System.out.println(“200卡类的附加费:” + PhoneCard200.additoryFee) System.out.println(“200卡接入号码:” + PhoneCard200.connectNumber); } } 面向对象编程
方法的声明 • 定义对类内成员变量(数据)的操作 • 方法的声明语法: [修饰符] 返回类型 方法名(参数列表) [ throws 例外名 ] { 方法体; } • 方法是类的动态属性,标志了类所具有的功能和操作 面向对象编程