《软件工程与实践》PPT课件.ppt_第1页
《软件工程与实践》PPT课件.ppt_第2页
《软件工程与实践》PPT课件.ppt_第3页
《软件工程与实践》PPT课件.ppt_第4页
《软件工程与实践》PPT课件.ppt_第5页
已阅读5页,还剩324页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件工程与实践第一讲软件工程概述 大连理工大学创新实验学院 软件危机 软件定义 一个软件必须由一个完整的配置组成 软件是程序 数据及相关文档的完整集合 软件开发的高成本与低质量的矛盾称为软件危机 软件危机 软件开发和维护过程中遇到一系列严重的问题 1 对软件开发成本和进度估计不准确 经费预算经常突破 完成时间一再拖延 2 开发的软件不能满足用户要求 开发初期对用户的要求了解不够明确 未能得到明确表达 开发工作开始后 软件人员和用户又未能及时交换意见 使得一些问题不能及时解决 导致开发的软件不能满足用户的要求 使开发失败 3 软件产品质量靠不住 4 软件可维护性差 开发过程没有统一的 公认的规范 软件开发人员按各自的风格工作 各行其事 开发过程无完整 规范的文档 发现问题后进行杂乱无章的修改 程序结构不好 运行时发现错误也很难修改 导致维护性差 5 开发的软件可靠性差 由于在开发过程中 没有确保软件质量的体系和措施 在软件测试时 又没有严格的 充分的 完全的测试 提交给用户的软件质量差 在运行中暴露出大量的问题 这种不可靠的软件 轻者会影响系统正常工作 重者会发生事故 造成生命财产的重大损失 6 软件没有适当的文档材料 7 传统的软件开发速度远远跟不上应用速度 与软件本身的特点有关和软件开发与维护的方法不正确有关 产生软件危机的原因 缺乏 可见性 管理和控制软件开发过程相当困难软件较难维护 规模庞大为了在预定时间内开发出规模庞大的软件 必须由许多人分工合作 然而 如何保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系统 不仅涉及许多技术问题 更重要的是必须有严格而科学的管理 1 与软件本身的特点有关 忽视软件需求分析的重要性 2 与软件开发与维护的方法不正确有关 轻视维护软件已经完成之后进行的维护是极端艰巨复杂的工作 需要花费很大代价 统计数据表明 实际上用于软件维护的费用占软件总费用的55 70 作好软件定义时期的工作 是降低软件成本提高软件质量的关键 克服软件危机的途径 用现代工程的概念 原理 技术和方法进软件开发 管理和维护 组织管理措施软件开发不是某种个体劳动的神秘技巧 而应该是一种组织良好 管理严密 各类人员协同配合 共同完成的工程项目 技术措施 方法和工具 在软件开发的每个阶段都有许多繁琐重复的工作需要做 在适当的软件工具辅助下 开发人员可以把这类工作做得既快又好 把各个阶段使用的软件工具有机地集合成一个整体 支持软件开发的全过程 则称为软件工程支撑环境 软件工程支撑环境 软件工程的定义 软件工程是指导计算机软件开发和维护的一门工程学科 软件工程是应用计算机科学 数学及管理科学等原理开发软件的工程 它借鉴传统工程的原则 方法 以提高质量 降低成本为目的 软件工程的性质 软件工程是涉及计算机科学 工程科学 管理科学 数学等领域的一门综合性的交叉学科 计算机科学中的研究成果均可用于软件工程 但计算机科学着重于原理和理论 而软件工程着重于如何建造一个软件系统 软件工程要用工程科学中的观点来进行费用估算 制定进度 制定计划和方案 要用管理科学中的方法和原理进行软件生产的管理 要用数学的方法建立软件开发中的各种模型和各种算法 如可靠性模型 用户需求的形式化模型等 软件工程的基本原理 用分阶段的生命周期计划严格管理坚持进行阶段评审实行严格的产品控制采用现代程序设计技术结果应用清楚地审查开发小组的人员应少而精承认不断改进软件工程实践的必要性 软件生命周期 软件生命周期是指一个软件项目被提出并着手实施开始 到该软件报废或停止使用为止 经历三个时期 软件定义 软件开发 运行维护 也称为软件维护 软件生命周期各阶段的基本任务 1 问题定义2 可行性研究3 需求分析4 总体设计5 详细设计6 编码和单元测试7 综合测试8 运行与维护 软件生命周期由软件定义 软件开发和运行维护 也称为软件维护 3个时期组成 每个时期又进一步划分成若干个阶段 1 问题定义回答 要解决的问题是什么 通过调研 写出关于问题性质 工程目标和工程规模的书面报告 并得到客户的确认 2 可行性研究回答 对于上一个阶段所确定的问题有行得通的解决办法吗 研究并论证软件系统的可行性 对方案进行选择并形成可行性分析报告 3 需求分析这个阶段的任务主要是确定目标系统必须具备哪些功能 建立逻辑模型必须准确完整地体现用户的要求 数据模型 实体 联系图 功能模型 数据流图 行为模型 状态转换图 书写规格说明书用正式文档准确地记录对目标系统的需求 4 总体设计 概要设计 回答 概括地说 应该怎样实现目标系统 软件设计的一条基本原理就是 程序应该模块化 也就是说 一个程序应该由若干个规模适中的模块按合理的层次结构组织而成 因此 总体设计的另一项主要任务就是设计程序的体系结构 也就是确定程序由哪些模块组成以及模块间的关系 建立软件系统的总体结构定义功能模块的接口设计全局数据库或数据结构规定设计约束编制概要设计文档 5 详细设计 模块设计 把解法具体化 回答 应该怎样具体地实现这个系统呢 模块详细设计模块的详细功能 算法 数据结构 模块间的接口等设计 拟定模块测试方案 编制模块的详细规格说明汇总模块详细设计的结果 形成模块详细规格说明书 6 编码和单元测试写出正确的容易理解 容易维护的程序模块 编码根据模块详细规格说明书 把详细设计的结果翻译成用选定的语言书写的程序 单元测试对模块程序进行测试 验证模块功能及接口与详细设计文档的一致性 并形成单元测试报告 7 综合测试通过各种类型的测试 及相应的调试 使软件达到预定的要求 集成测试根据设计的软件结构 把经过单元测试检验的模块按某种选定的策略装配起来 在装配过程中对程序进行必要的测试 验收测试按照规格说明书的规定 由用户对目标系统进行验收 现场测试或平行运行平行运行就是同时运行新开发出来的系统和将被它取代的旧系统 以便比较新旧两个系统的处理结果 用正式的文档资料把测试计划 详细测试方案以及实际测试结果保存下来 作为软件配置的一个组成部分 8 软件维护维护阶段的关键任务是 通过各种必要的维护活动使系统持久地满足用户的需要 改正性维护诊断和改正在使用过程中发现的软件错误 适应性维护修改软件以适应环境的变化 完善性维护根据用户的要求改进或扩充软件使它更完善 预防性维护修改软件为将来的维护活动预先做准备 每一项维护活动都应该经过提出维护要求 或报告问题 分析维护要求 提出维护方案 审批维护方案 确定维护计划 修改软件设计 修改程序 测试程序 复查验收等一系列步骤 软件工程与实践第二讲Java语言概述 大连理工大学创新实验学院 从C语言到Java Java在虚拟机上运行Java语言源程序被编译成一种高层次的与机器无关的以及结构中立的字节码语言 该格式语言在Java虚拟机上运行 只要有Java语言运行系统的机器都能执行这种中间代码 也就是说如果要运行Java必须要安装Java环境 Java是完全面向对象的Java是一种完全面向对象的语言 这意味着你对任何一个Java对象所做的动作都是通过一个方法实现的 第一点就是 再也没有没有主函数这样的孤立的东西了 取而代之的是 你必须开始用一个对象的看法看待一个程序 一个类的对象 从C语言到Java 类和对象分别是什么 可以暂时理解为结构体类型和结构体变量 例如圆周结构体 汽车结构体等 structCircle floatx y floatr Circlec1 进一步 类还可以包括一系列函数 classCircle floatx y floatr voidsetCenter floatu floatv voiddraw 注 少了private public以及类的实现 从C语言到Java Java中没有独立的头文件在Java中 关于类的一切东西都被放到一个单独的文件中 方法的位置只可能在一个地方出现 一个方法的实现必须在它的定义过程中同时进行 这样做得优点是在实现程序的时候不容易因为文件的非同步错误而失败 或者获取到一个没有实现的声明 类的声明可以被Java解释器利用甚至是从一个编译过的单元中获取 所以不再需要有头文件 只要有编译过的文件 这样做的缺点与我们编程的过程有关 许多C C 程序员喜欢用头文件来代替文档 要看一个成员函数的接口参数 只需要看头文件中的声明即可 你可以经常的看头文件即可了解怎样去使用这个类 在Java中 没有这样的总结 从C语言到Java 用Package来分解Java命名空间在大的C 工程中经常遇到的一个问题是命名空间 namespace 怎样保证工程的一些程序员不会创建和另一些程序员一样名字的类 更糟糕的是 供应商可能会提供一个包含和你的类一样名字的类的库 有许多方法可以解决这一问题 但是很可能在问题发现之前工程已经启动 改正错误是需要付出许多痛苦的 Java通过 Package 这个概念解决了这个问题 Package 可理解为目录 有效地通过通过集合类划分了命名空间 在不同包内的两个同名的类仍然是不同的 关键问题就变成了类是否放置到相应的包中 从C语言到Java 异常是Java的重要特性计算一个数的方根时 要调用sqrt函数 正常的接口形式是将一个正数作为参数传入方法 然后方法会返回一个正实数作为结果 在C程序中一旦入口参数为负数 程序就不正常的退出 在Java中可以 捕获异常 方式来解决上述问题 并且已经成为语言中非常成熟的部分 方法的说明中就包含了异常的信息 有些方法如果没有捕获异常 在编译时就通不过 b 1 try a sqrt b catch Exceptione 从C语言到Java 字符串不再是字符数组Java中包括了一个字符串的对象 并且是个常量 字符串不像字符数组一样 虽然可以简单的从一个字符数组构造一个字符串 你应该尽可能的用字符串代替字符数组 因为他们不会因为误操作而被覆盖 Java没有指针理解指针的概念是一个C或C 程序员最难应付的问题 指针也是错误产生的一大根源 Java中没有指针 对象的句柄直接作为参数传递 而不是传递指针 另外 你必须通过索引使用数组 这些都不是什么大问题 然而 没有指针是在写含有函数指针或者成员函数指针的系统的时候引起很大麻烦 这个问题在处理回调函数的时候更加显著 从C语言到Java Java使用垃圾回收在垃圾回收的语言中 运行时环境一直监测哪些内存不被使用 当一块内存不用的时候 系统自动的回收内存 比如说 一个对象在一个方法中生成 但是没有在返回时调用或者没有储存为全局变量 不能在方法外部使用 系统自己会知道哪些变量是你用不到的 哪些是可以用到的 因此 你不必再为破坏对象回收内存而担心 在C C 中 很多的调试时间都被使用到检查内存漏洞中 Java的这种方法很大程度上降低了这种错误的可能 但是它依然不能处理逻辑混乱的程序 它们不能够被回收 从C语言到Java Java以一些预定义的类为基础默认的Java环境中包括一些从Java基础类实现而来的一些包 这些允许你很快的写出一些有用的程序 这些包如下 java awt 当今许多应用程序都非常依赖GUI java提供了一个AbstractWindowToolkid 这可以让你在不考虑运行平台的前提下处理GUI对象 java applet applet的主要目的是提供浏览有关的内容 它本身是awt组件的子类并且支持其他一些特性 比如声音 渲染等 java io java io提供了对流 文件 管道的读写操作 java lang 提供了java的基础类Object Integer Float 提供对网络编程的支持 包括处理socket URL Internet寻址等 java util 为数据结构提供的通用实用工具集 Java的 Hello world 文件类型 javaJava源文件 class二进制字节码文件编译过程 本地计算机系统 Java虚拟机 JVM class二进制字节码文件 javajava源程序文件 编译 Java的 Hello world Java虚拟机 JVM javavirtualmachine Java虚拟机类似于一个小巧而高效的CPU Java处理器 芯片 一般由软件实现 加载程序运行所需要的所有的类 确定可执行程序的内存布局 字节码验证器测试代码段的格式 检查代码段是否有非法代码 伪造指针 对象上的非法存取 试图改变对象类型等 指令集 寄存器组 栈 垃圾回收 堆 方法区域 Java的 Hello world Java的程序类型Application Java应用 是可以独立运行的Java程序 由Java解释器控制执行 Applet Java小程序 不能独立运行 而是被嵌入到Web页中 由与Java兼容的浏览器控制执行 Servlets读入用户发来的数据 通常在web页的form中 找出隐含在HTTP请求中的其他请求信息 如浏览器功能细节 请求端主机名等 产生结果 调用其他程序 访问数据库 直接计算结果 格式化结果 网页 设置HTTPresponse参数 如告诉浏览器返回文档格式 将文档返回给客户端 Java的 Hello world JDK安装环境变量设置JAVA HOME CLASSPATH lib jar jar 类 class文件及若干级上层目录的某种压缩格式 Path设置 bin Java的 Hello world 实用程序javacJava编译器 将Java源程序编译成字节码javaJava解释器 直接从类文件执行Java应用程序 即applicationappletviewer小程序浏览器 执行html文件中的Java小程序 即applet Java的 Hello world Hello javaimportjava io publicclassHello publicstaticvoidmain Stringargs for intj 0 j 5 j System out println Hello world 类声明与定义 类中的方法 语句结尾以分号标志 用大括号括起语句组 引用包 Java的 Hello world Java语言区分大小写类名第一个字母大写HelloSystem方法 函数 名第一个字母小写main out printLn 变量名第一个字母小写args内含单词首字母大写helloWorldgetInstance Java的 Hello world Application程序基本结构由一个或多个 类 组成 其中必须有一个 类 定义了main 方法 该方法是自动执行的类方法 是Java应用运行的起始点 而这个类也就称之为 主类 如Hello javajavacHello java Hello class JavaHello Hello world Java的 Hello world applet小程序applet程序中必须包含java applet Applet类的子类 该子类就是applet小程序的主类 系统类Applet中已经定义了很多的成员域和成员方法 它们规定了Applet小程序如何与执行它的解释器 WWW浏览器配合工作 主方法 被浏览器自动调用的方法 init start stop destroy paint Java的 Hello world 编写applet小程序就是根据需要重新编写这些方法 当applet的字节码文件下载后 浏览器首先创建Applet实例并调用从Applet类那里继承来的init 方法进行初始化工作 然后调用start 方法开始applet小程序的执行 当用户离开小程序所在页面时 浏览器调用stop 方法停止小程序执行 当用户重新进入小程序页面时 就再调用start方法 当用户退出浏览器时 浏览器调用destroy 方法并释放资源 每当需要在Applet的界面中显示文字 图形和其他界面元素时 浏览器调用paint 方法重画界面 什么是继承 Java的 Hello world 编辑Java源文件HelloApplet javaimportjava awt Graphics importjava applet Applet 将java applet包中的系统类Applet引入本程序publicclassHelloAppletextendsApplet publicvoidpaint Graphicsg g drawString Hello JavaWorld 10 20 编译java小程序javacHelloApplet java Java的 Hello world 建立index html文件 嵌入HelloApplet class浏览html文件使用appletviewerappletviewerindex html使用常规的浏览器javacHelloApplet javaappletviewerindex html 100 Integermul for inti 1 i 100 i mul i System out printLn Integer mul toString 这么简单 Java基础 数值溢出以效率换取准确性 借助字符串表示整数重新定义乘法个位数相乘mult 1 1 3 7 21 个位数相加plus 1 1 6 7 13 取子串truncNumber 12345678 4 1234 补零addZero 123 4 1230000 多位数和个位数相加plus n 1 48 6 54 多位数相加多位数相乘涉及到的几个问题字符串如何表示 字符串的拼接 比较 截取等操作如何 数据类型间如何转换 数组如何应用 Java基础 基本数据类型booleanb true shortsi 128 inti j k 99 longl 123456789 charch J charchc 中 floatf 3 1415926 doubled 1 04E 5 直接分配内存空间 Java几乎是将字符串视为基本数据类型Strings 你好 扩展数据类型类数组 Java基础 定义类 新的数据类型 classMyDate intday intmonth intyear 定义对象MyDated1 d1 newMyDate 动态分配内存空间 47 Java基础 MyDated1 newMyDate d1 day 28 d1 month 12 d1 year 70 Java基础 String char Wrapper 包装 类 Java基础 包装类StringJava语言将字符串作为对象来处理 每一个字符串常量是字符串类String的一个实例 构造方法方法 成员函数构造方法 初始化 与类同名String String String String charchars 创建字符串Strings newString 生成一个空字符串Strings newString abc char data a b c Strings newString data Strings abc 采用字符串直接定义获得内存空间 Java基础 intx 123 inty x Strings1 abc Strings2 s1 null xys1s2 abc s2 def Java基础 Strings1 newString abc Strings2 newString abc 0 x01234567 0 x12345678 s1s2 abc abc s1 s2falses1 equals s2 true Java基础 Java的字符串连接运算符 XXXXX abc s1 Strings1 abc s1 s1 def Java基础 方法intlength 返回字符串长度例 Java与面向对象程序设计 length 的值为13charcharAt intindex 返回指定位置的字符例 Java与面向对象程序设计 charAt 2 intcompareTo Strings2 按字母序进行字符串比较booleanequals Objectobj 判断字符串相等 区分大小写 booleanequalsIgnoreCase Strings2 不区分大小写 StringtoLowerCase 将字符串所有大写字母转换为小写StringtoUpperCase 将字符串所有小写字母转换为大写 Java基础 Stringsubstring intbeginIndex 取子串Stringsubstring intbeginIndex intendIndex intindexOf Stringstr 返回str在当前串中开始位置intindexOf Stringstr intfromIndex booleanstartsWith Stringprefix 判断该字符串是否以prefix为前缀 booleanendsWith Stringsuffix 判断该字符串是否以suffix为后缀 char toCharArray 将字符串转为字符数组 Java基础 int的包装类Integer属性staticintMAX VALUE返回int型数据的最大值staticintMIN VALUE返回int型数据的最小值构造方法Integer intvalue Integer Strings 方法intintValue doubledoubleValue StringtoString staticStringtoString inti staticintparseInt Strings staticIntegervalueOf Strings static 静态的 类名 方法 属性 一般情况是对象名 属性 Java基础 利用类方法 静态方法 staticintInteger parseInt 23 staticStringInteger toString 23 staticdoubleDouble parseDouble 12 3 staticStringDouble toString 12 3 利用对象方法Doubled Strings 声明d newDouble 12 3 创建s d toString Double valueOf 12 3 doubleValue 返回 Java基础 数组在其他语言中是相同数据类型的元素的集合 而在Java中 数组是独立的类 有自身的方法 不是变量的集合一个数组是数组类的一个对象 数组是通过new运算符来动态创建 并分配与数组下标数和维数 数组数据类型相匹配的内存空间 数组一经被分配了适当的空间 则其所有元素都初始化为默认值 Java中 数组声明允许方括号跟在数组类型声明之后 数组的声明intintArray 不是指长度可变 int intArray Java基础 数组的长度不是在声明时指定 而是在创建时由所开辟的内存单元数目确定数组的创建 3步 数组的声明创建数组空间创建数组元素并初始化 若数组元素为基本数据类型 第三步可以省略 当数组元素为对象时 则必须对数组元素进行创建和初始化 一维数组定义int intArray 数组类对象引用说明 intArray 动态分配空间 newint 5 或数组初始化 int intArray newint 5 Java基础 创建方法 先声明后创建intintArray intArray newint 10 在声明的同时创建intintArray newint 10 直接赋值int intArray 1 2 3 4 5 Java基础 定义数组Integer a 注意此时为包装类 Integer b newInteger 5 创建数组元素的对象实例for inti 0 i b length i b i newInteger i 10 创建数组时初始化Integer d newInteger 1 newInteger 2 newInteger 3 Java基础 int intArray 11 47 93 26 38 分配空间 赋初值静态初始化必须与数组定义放在一个语句中 intArray newint 10 原数组丢失数组定义后还不能立即被访问 因为还没有为其分配内存空间 数组必须经定义后再创建这一步才能使用 XXXX intArray 软件工程与实践第三讲面向对象程序设计 大连理工大学创新实验学院 面向对象概述 什么是面向对象术语 面向对象 是由英文ObjectOriented翻译而来的 简称为OO 面向对象的程序设计是目前软件工业的主流 绝大多数的系统程序 应用程序都是采用面向对象的思想来设计开发的 在面向对象概念中 整个世界是由各种各样的对象 Object 组成的 世界上存在着许多类型相同的对象 也存在着许多类型不相同的对象 例如 一辆自行车和一根铅笔是类型不同的两个对象 而李明的自行车和李芳的自行车可以看作是类型相同的两个对象 早期的计算机程序设计语言经历了面向机器 Machine Oriented 面向过程 Procedure Oriented 等阶段 随着计算机技术的发展 以及要解决的问题越来越复杂 早期的程序设计语言已经不能适应实际的需求 从上个世纪60年代末 陆续开发出了多个面向对象的程序设计语言 例如 C Java等 面向对象程序设计语言的出现带动了面向对象的程序设计方法 面向对象概述 什么是面向对象面向对象的程序设计是以要解决的问题中所涉及的各种对象为主体 力求程序设计符合人们日常的思维习惯 降低问题的难度和复杂性 提高编程的效率 使用面向对象的程序设计方法来解决问题就是从实际问题中抽象并封装数据和操作的对象 通过定义其状态和操作其行为来表述对象的特征和功能 此外 还可以通过定义接口来描述对象的地位以及与其他对象的关系 最终形成一个广泛联系的可理解 可扩充 可维护及更接近于问题本来面目的动态对象模型系统 面向对象概述 常用术语的含义在面向对象程序设计中 经常使用一些术语 下面介绍几个常用的术语 1 对象 Object 对象是面向对象程序设计的核心 也是程序的主要组成部分 一个程序实际上就是一组对象的总和 在现实世界中 人们面对的所有事物都可以称为对象 例如 电视 台灯 猫 狗 草木等等 在Java语言中 对象是由数据以及对数据进行处理的方法组成的 是对现实世界的抽象描述 在面向对象程序设计中 通过对象的状态 States 和行为 Behaviors 两个方面描述对象 每一个对象都是由状态和行为两个最基本的部分组成的 虽然同一类对象的行为都是一样的 但是每个对象的状态都是独立与其他对象的 例如 改变速度是任何一辆自行车都具有的行为 但是每辆自行车的品牌 型号 颜色 所有者等状态又是不同 面向对象概述 常用术语的含义 2 类 Class 对象是由类创建的 类是同一类型对象的集合和抽象 例如 汽车有很多种类 包括轿车 卡车 公共汽车等 它们是不同的对象 但是都属于车类 存在着许多共同点 例如 都可以加速 刹车等 在Java语言中 每一个类是一种对象类型数据 属于不同类的对象具有不同的数据类型 一个对象被称为其类的一个实例 是该类的一次实例化的结果 例如 月饼模子可以看作是月饼的类 使用模子做月饼的过程实际上就是一个实例化的过程 最终制作出的月饼是该月饼模子的一个对象 类还可以具有子类 子类除了具有类的所有状态和行为外 还具有自己特有的状态和行为 例如 哺乳动物类是动物类的一个子类 它除了具有动物类共有的状态和行为外 还具有胎生 哺乳等哺乳动物类特有的状态和行为 面向对象概述 常用术语的含义 3 域 Field 域是类或者对象的状态属性的总称 它可以是普通数据类型的变量 也可以是其他类的对象 例如 在自行车类中 品牌和颜色可以是String类型数据 型号可以是int类型数据 当前速度可以是double类型数据 在Java语言中使用实例变量来表达类或者对象的状态 并且这些变量必须在类方法的外边定义 作用于整个类 4 方法 Method 方法是类的行为属性的总称 一个类可以有多个方法 表示该类所具有的功能和操作 通过对象调用类中的方法就可以改变对象域中变量的值 例如 自行车类具有加速和减速的方法 通过一个自行车对象调用加速方法就可以改变对象中保存当前速度的实例变量的值 面向对象概述 程序设计过程使用面向对象方法解决问题的过程可以大体划分为面向对象分析 ObjectOrientedAnalysis 简称OOA 面向对象设计 ObjectOrientedDesign 简称OOD 和面向对象编程 ObjectOrientedProgramming OOP 三大步骤 1 面向对象分析 OOA 面向对象分析的主要作用是明确使用程序的用户 用户可以进行的操作 以及数据的输入 输出和储存 并且用标准化的面向对象模型规范地表述这些内容 最后形成面向对象分析模型 即OOA模型 在分析问题时 要抽取所有需要的对象实体 然后确定这些对象的状态和行为 以及它们之间的相互关系 一般来说 解决一个问题会涉及到多个对象 所以这些对象之间的关系一定要明确 从而反映出整个程序的功能和状态 例如 自动取款机程序的使用用户包括银行和用户 它有可能涉及到的对象包括用户 帐户 自动取款机和提款卡等等 面向对象概述 程序设计过程 2 面向对象设计 OOD 面向对象设计是将在面向对象分析步骤中创建的OOA模型加以扩展并得到面向对象设计步骤中的OOD模型 面向对象设计在OOA模型的基础上引入界面管理 任务管理和数据管理三部分的内容 进一步扩充OOA模型 界面管理负责整个系统的人机对话界面的设计 任务管理负责处理整个程序资源管理功能的工作以及设置客户与服务器之间的接口 数据管理负责设计程序与数据库的交换方式 面向对象设计还需要明确每个类方法的参数 返回值 功能等 以及各类之间的相容性和一致性的验证 对各个类 类内成员的访问权限的严格合理性的验证 也包括验证对象类的功能是否符合用户的需求 例如 自动取款机的OOD模型要包括用户 帐户 自动取款机的人机对话界面设计 使用自动取款机的用户和自动取款机服务器之间的操作 自动取款机服务器与数据库之间的操作等等 面向对象概述 程序设计过程 3 面向对象编程 OOP 面向对象编程就是具体的程序编写阶段 其主要过程是先选择一种合适的面向对象编程语言 再用选定的语言编写程序实现设计步骤中对各个对象的详尽描述 然后将编写好的各个类根据其关系集成为整个程序 最后通过各种实例测试找出程序的漏洞并改善程序 最终完成整个软件的开发 面向对象概述 面向对象程序设计的特点面向对象程序设计提高了软件的生产效率和程序模块的重复使用率 并且降低了维护成本 面向对象程序设计的主要特点是 1 封装 Encapsulation 封装就是将对象的数据和基于数据的方法封装在一起成为一个整体 类 所有的程序编写基本上都是通过创建类的对象 然后以对象为载体 进行数据交流和方法的执行 封装是一种数据信息隐藏技术 使用者只需要知道对象中变量和方法的功能 而不必知道行为实现的细节 也就是说 类的使用者与设计者是分开的 此外 封装使得类的可重用性大为提高 2 多态 Ploymorphism 多态是指程序的多种表现形式 在同一个类中 同名但参数不同的多个方法 方法重载 是多态的一种表现形式 另一种表现形式是子类对父类方法的覆盖或者子类对抽象父类中的抽象方法的具体定义 面向对象概述 面向对象程序设计的特点 3 继承 Inheritance 继承是指一个类拥有另一个类的所有变量和方法 被继承的类称为父类 继承了父类的所有数据和操作的类称为子类 继承使得程序结构清晰 降低编程和维护的工作量 4 抽象 Abstraction 抽象是具体事物一般化的过程 即对具有特定属性的对象进行概括 从中归纳出这一类对象的共性 并从共同性的角度描述共有的状态和行为特征 抽象包括数据抽象和方法抽象两个方面 数据抽象用来描述某类对象的共同状态 方法抽象用来描述某类对象的共同行为 域和方法 域我们在前面介绍过域是类或者对象的状态属性的总称 它可以是普通数据类型的变量 也可以是其他类的对象类型变量 域常见的有实例变量 静态变量和最终变量3种形式 分别介绍如下 1 实例变量实例变量 InstanceVariable 用来储存某个类对象的状态值 它必须在类内 任何方法外被定义 一般位于整个类语句体的最前端 其修饰符可以是public或者private 但是不能使用static 实例变量的使用范围是整个类 也就是说可以在类中的任意方法内被使用 实例变量是依据其对象存在的 当运行程序创建对象的同时 创建了其实例变量 当程序运行完成 对象消失 其实例变量也同时消失 域和方法 域变量name age gender height和weight分别表示人的姓名 年龄 性别 身高和体重 当创建People类的对象时 每个对象的实例变量也是这5个变量 只是对象之间的变量值有可能不同 如图所示为创建了3个People类对象的演示效果图 域和方法 域2 静态变量用修饰符static修饰的变量称为类静态变量 也叫做静态变量或者类变量 静态变量是类的变量 不属于任何一个类的具体对象实例 它不保存在某个对象实例的内存空间中 而是保存在类的内存空间的公共存储单元中 也就是说 不论一个类具有多少个对象 静态变量只有一个 任何一个类的对象访问它 取得的都是相同的数值 同样地 任何一个类的对象去修改它 也都是在对同一个内存单元进行操作 静态变量可以通过类名直接访问 也可以通过对象来调用 采用这两种方法取得的结果是相同的 域和方法 域2 静态变量静态变量与实例变量虽然都是在类内 类中方法之外定义的变量 但是它们有着本质的不同 1 实例变量 一般使用private或者public作为修饰符 每个类的对象都具有一套属于自己的 在类中定义的实例变量 每个对象只能修改或者访问其自身的实例变量 不会影响其他对象的实例变量 2 静态变量 使用static修饰符 每个类的所有对象共同拥有一套类的静态变量 类和其对象都可以修改或者访问静态变量 域和方法 域3 最终变量在编写程序时 可以给某些经常要使用具有特殊含义或者内容复杂的常量 取一个类似于变量名的标识符 这样就可以通过使用这个变量名称来引用其对应的常量 而不是每次直接键入常量数值 这种做法的最主要目的是使程序更加清楚 利于其他人阅读 理解 使用修饰符final修饰的变量是最终变量 其保存的数据在程序的整个执行过程中都不会改变 通常 我们在final前面再加上修饰符static 那么这个变量的实际含义就是常量 如果在定义最终变量时 没有给其赋值 则按该类型数据的默认值进行初始化 final修饰符可以修饰局部变量 也必须且只能赋值一次 它的取值在变量存在期间不会改变 此外 使用修饰符volatile修饰变量被称为易失域 通常用于进行多线程编程 这种变量可以同时被多个线程控制和修改变量值 域和方法 构造方法构造方法 ConstructorMethod 也称为构造函数 是一种特殊的方法 在创建对象的同时 调用这个对象所属类的构造方法来完成对象实例变量的初始化 构造方法的形式如下 public类名 参数 语句体 其中的语句体为初始化实例变量的赋值语句 可以使用参数值作为变量的初值 也可以直接给变量赋具体的数值 一般来说 构造方法具有以下几个的特点 域和方法 构造方法 1 构造方法的方法名与其所在类的名称相同 2 虽然构造方法没有返回值 但是也不能有void关键字 3 构造方法的修饰符总是public 4 构造方法的主要作用是完成对类对象实例变量的初始化工作 例如 可以为People类增加一个如下所示的构造方法publicPeople name 沈昕 age 26 gender F height 1 62 weight 55 5 在上面的构造方法中 一共给5个实例变量赋了初值 当调用该构造方法时 就可以完成对5个实例变量的初始化 域和方法 构造方法如果希望在创建对象时 其实例变量具有不同的初值 可以通过传递参数并将参数值赋给实例变量的方法来实现 构造方法的参数要与实例变量一一对应 例如 People类的另一种构造方法为 publicPeople StringinitName intinitAge charinitGender doubleinitHeight doubleinitWeight name initName age initAge gender initGender height initHeight weight initWeight 一般情况下 一个类中可以有一个或者多个构造方法 它们的方法名称相同但是参数不同 相当于方法的重载 我们将在后面具体介绍方法重载 域和方法 方法除了构造方法外 类中还有许多描述类行为的方法 这些方法可以分为实例方法和静态方法两种 1 实例方法它属于每个对象 只能通过类的对象调用 实例方法用来定义某个类的行为 也就是说类的对象所能进行的操作 与实例变量一样 实例方法的修饰符可以是public或者private 但是不能用static 如果希望实例方法可以在类之外被访问 则使用public 如果希望实例方法只在类内被访问 则使用private 例如 在People类中 我们可以定义一个setName 方法用来改变People类某个对象的姓名 该方法内容如下 publicvoidsetName StringnewName name newName 域和方法 方法2 静态方法与静态变量类似 静态方法的本质是属于整个类的 而不属于某个实例对象 因为静态方法属于类本身 所以只要定义了类 它的静态方法就存在 就可以直接使用类来调用 在使用静态方法时要注意以下几个问题 1 使用static修饰的静态方法是属于某个类的 它在内存空间中的内容将随着类的定义而进行分配和装载 不被任何一个对象所单独拥有 2 静态方法不能操纵和处理属于某个对象的实例变量 而只能处理属于整个类的静态变量 也就是说静态方法只能处理静态变量或者调用静态方法 3 因为静态方法不能访问实例变量 所以在静态方法中不能使用关键字this 域和方法 方法2 静态方法 4 需要调用某个静态方法时 可以使用其所属的类的名称直接调用 也可以用类的某个具体的对象名调用 其形式为 类名 静态方法名 或者对象名 静态方法名 Math类中的abs max 等方法 以及Integer类中的parseInt 方法等就是静态方法 直接用类名进行访问 作为程序入口的main 方法必须要用static来修饰 也是因为Java运行时系统在开始执行一个程序前 并没有生成类的一个对象 它只能通过类名来调用main 方法作为程序的入口 方法的使用 调用方法在完成类程序的编写后 就可以在其他程序中创建该类的对象 并调用该类的实例方法 注意 类的程序和使用类的程序要保存在同一个目录下 1 调用构造方法如果在定义类对象时没有定义任何构造方法 系统会自动产生一个构造方法 无需定义 称为默认构造方法 默认构造方法不带任何形式的参数 并且方法体为空 例如 如果上面的People类没有定义构造方法 则系统产生的默认构造方法如下 People 方法的使用 调用方法2 调用实例方法在调用某个类中的实例方法之前 要先创建该类的对象 然后通过该对象并且使用符号 来调用所要访问的实例方法 例如 下面是某个程序中的两条语句 Peoplep1 newPeople p1 setName 李芳 其中 第一条语句是调用People类的第一种构造方法来创建对象p1 第二条语句是通过对象p1调用setName 方法来改变对象p1实例变量name的值 classPeople voidsetName Stringvalue name value 方法的使用 访问方法1 修饰符public和private对于类中的实例变量和实例方法 一般使用修饰符public或者private 1 public 表示该实例变量或者实例方法可以在其所在的类的内部或者外部被访问和调用 大多数情况下 我们定义实例方法为public 2 private 表示该实例变量或者实例方法只可以在其所在的类的内部被访问和调用 大多数情况下 我们定义实例变量为private 如果我们定义实例变量为public 则可以通过对象直接修改该变量 如果实例变量的修饰符为private 则必须在其所在类中添加一个实例方法来修改变量的值 很显然将实例变量的修饰符设置为public后 可以更方便地在应用程序中改变变量的值 但是为什么大多数程序都将实例变量定义为private 然后再通过实例方法来改变其值呢 方法的使用 访问方法1 修饰符public和privateclassRectangle privateintwidth privateintheight publicvoidsetWidth intnewWidth if newWidth 0 width newWidth elsewidth 0 publicvoidsetLength intnewLength if newLength 0 length newLength elselength 0 方法的使用 访问方法protected2 访问方法访问方法 AccessorMethod 是类中一种可以修改和获取private实例变量值的实例方法 为了与其他实例方法区别 一般使用set或者get再加实例变量名称作为该方法的名称 比如 setName 表示修改实例变量name的值 getHeight 表示获取实例变量height的值 该方法的修饰符必须为public 在编写Rectangle类时 并不是必须具有以上所有的访问方法 可以根据用户的需求范围来确定添加哪些访问方法 例如 用户要求矩形的位置是固定的 只能改变其宽度和长度 那么就不需要setX 和setY 方法 此外 这些方法的内容并不是固定的 以上所给出的只是其最简单的语句体 根据要用户要求 方法中内容可以随意更改 例如 前面介绍的setWidth 方法和setLength 方法 属性x privateTx publicvoidsetX Tv publicTgetX 方法的使用 方法重载方法的重载是指在同一个类中 定义方法名称相同但参数不同的多个方法 当调用某个重载的方法时 Java会根据参数的类型 个数和顺序的不同 调用与之相符的方法 例如 在Math类中 许多方法都是有重载的 例如 求绝对值方法abs 就有double float int和long四种不同的参数类型 再比如 前面介绍的构造方法 也是方法名称相同但参数不同 每个重载方法中的语句体可以相同也可以不同 方法的使用 this1 关键字this的作用当需要在类的实例方法中 指向调用该实例的对象时 可以使用关键字this 在大多数情况下 关键字this不是必须使用的 可以被省略 例如 Rectangle类中的setPosition 实例方法可以被写成如下形式 publicvoidsetPosition intnewX intnewY this x newX this y newY 其中 this表示当前调用该方法的Rectangle类对象 方法的使用 this1 关键字this的作用如果在应用程序中的语句为 r1 setPosition 100 200 则在执行setPosit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论