![[计算机]软件工程与实践.ppt_第1页](http://file.renrendoc.com/FileRoot1/2019-1/2/b799a99f-c4a0-4a0e-a1a0-3dd3e2063351/b799a99f-c4a0-4a0e-a1a0-3dd3e20633511.gif)
![[计算机]软件工程与实践.ppt_第2页](http://file.renrendoc.com/FileRoot1/2019-1/2/b799a99f-c4a0-4a0e-a1a0-3dd3e2063351/b799a99f-c4a0-4a0e-a1a0-3dd3e20633512.gif)
![[计算机]软件工程与实践.ppt_第3页](http://file.renrendoc.com/FileRoot1/2019-1/2/b799a99f-c4a0-4a0e-a1a0-3dd3e2063351/b799a99f-c4a0-4a0e-a1a0-3dd3e20633513.gif)
![[计算机]软件工程与实践.ppt_第4页](http://file.renrendoc.com/FileRoot1/2019-1/2/b799a99f-c4a0-4a0e-a1a0-3dd3e2063351/b799a99f-c4a0-4a0e-a1a0-3dd3e20633514.gif)
![[计算机]软件工程与实践.ppt_第5页](http://file.renrendoc.com/FileRoot1/2019-1/2/b799a99f-c4a0-4a0e-a1a0-3dd3e2063351/b799a99f-c4a0-4a0e-a1a0-3dd3e20633515.gif)
已阅读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,类和对象分别是什么?可以暂时理解为结构体类型和结构体变量。例如圆周结构体,汽车结构体等。 struct Circle float x, y; float r; ; Circle c1; 进一步,类还可以包括一系列函数。 class Circle float x, y; float r; void setCenter(float u, float v); void draw(); ; 注:少了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 (Exception e) ,从C语言到Java,字符串不再是字符数组 Java中包括了一个字符串的对象,并且是个常量。字符串不像字符数组一样,虽然可以简单的从一个字符数组构造一个字符串。你应该尽可能的用字符串代替字符数组,因为他们不会因为误操作而被覆盖。 Java没有指针 理解指针的概念是一个C或C+程序员最难应付的问题。指针也是错误产生的一大根源。Java中没有指针,对象的句柄直接作为参数传递,而不是传递指针。另外,你必须通过索引使用数组。这些都不是什么大问题。然而,没有指针是在写含有函数指针或者成员函数指针的系统的时候引起很大麻烦。这个问题在处理回调函数的时候更加显著。,从C语言到Java,Java使用垃圾回收 在垃圾回收的语言中,运行时环境一直监测哪些内存不被使用。当一块内存不用的时候,系统自动的回收内存。比如说,一个对象在一个方法中生成,但是没有在返回时调用或者没有储存为全局变量,不能在方法外部使用。系统自己会知道哪些变量是你用不到的,哪些是可以用到的。因此,你不必再为破坏对象回收内存而担心。在C/C+中,很多的调试时间都被使用到检查内存漏洞中。Java的这种方法很大程度上降低了这种错误的可能。但是它依然不能处理逻辑混乱的程序,它们不能够被回收。,从C语言到Java,Java以一些预定义的类为基础 默认的Java环境中包括一些从Java基础类实现而来的一些包。这些允许你很快的写出一些有用的程序,这些包如下: java.awt:当今许多应用程序都非常依赖GUI,java提供了一个Abstract Window Toolkid,这可以让你在不考虑运行平台的前提下处理GUI对象。 java.applet:applet的主要目的是提供浏览有关的内容。它本身是awt组件的子类并且支持其他一些特性,比如声音、渲染等。 java.io:java.io提供了对流、文件、管道的读写操作。 java.lang:提供了java的基础类Object,Integer,Float; :提供对网络编程的支持。包括处理socket,URL,Internet寻址等。 java.util:为数据结构提供的通用实用工具集,Java的“Hello, world!”,文件类型 .java Java源文件 .class 二进制字节码文件 编译过程,本地计算机系统,Java虚拟机(JVM),.class 二进制字节码文件,.java java源程序文件,编译,Java的“Hello, world!”,Java虚拟机(JVM-java virtual machine ) Java虚拟机类似于一个小巧而高效的CPU,Java处理器“芯片”,一般由软件实现,加载程序运行所需要的所有的类,确定可执行程序的内存布局。 字节码验证器测试代码段的格式,检查代码段是否有非法代码(伪造指针,对象上的非法存取,试图改变对象类型等) 指令集、寄存器组、栈、垃圾回收“堆”、方法区域,Java的“Hello, world!”,Java的程序类型 Application “Java应用”是可以独立运行的Java程序。 由Java解释器控制执行。 Applet “Java小程序”不能独立运行,而是被嵌入到Web页中。 由与Java兼容的浏览器控制执行。 Servlets 读入用户发来的数据(通常在web页的form中) 找出隐含在HTTP请求中的其他请求信息(如浏览器功能细节、 请求端主机名等) 产生结果(调用其他程序、访问数据库、直接计算结果) 格式化结果(网页) 设置HTTP response参数(如告诉浏览器返回文档格式) 将文档返回给客户端。,Java的“Hello, world!”,JDK安装 环境变量设置 JAVA_HOME= CLASSPATH= .; lib*.jar (jar:类.class文件及若干级上层目录的某种压缩格式) Path设置: bin;,Java的“Hello, world!”,实用程序 javac Java编译器,将Java源程序编译成字节码 java Java解释器,直接从类文件执行Java应用程序, 即application appletviewer 小程序浏览器,执行html文件中的Java小程序, 即applet,Java的“Hello, world!”,Hello. java import java.io.*; public class Hello public static void main(String args) for ( int j=0; j5; j+) System.out.println(“Hello, world!”); ,类声明与定义,类中的方法,语句结尾以分号标志,用大括号括起 语句组,引用包,Java的“Hello, world!”,Java语言区分大小写 类名第一个字母大写 Hello System 方法(函数)名第一个字母小写 main() out.printLn() 变量名第一个字母小写 args 内含单词首字母大写 helloWorld getInstance,Java的“Hello, world!”,Application程序基本结构 由一个或多个“类”组成。 其中必须有一个“类”定义了main() 方法,该方法是自动执行的类方法,是Java应用运行的起始点。而这个类也就称之为“主类”。 如 Hello.java javac Hello.java (Hello.class) Java Hello (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.java import java.awt.Graphics; import java.applet.Applet; /将java.applet包中的系统类Applet引入本程序 public class HelloApplet extends Applet public void paint(Graphics g) g.drawString(“Hello, Java World!”, 10, 20); 编译java小程序 javac HelloApplet.java,Java的“Hello, world!”,建立index.html文件,嵌入HelloApplet.class 浏览html文件 使用appletviewer appletviewer index.html 使用常规的浏览器 javac HelloApplet.java appletviewer index.html,100!,Integer mul; for (int i = 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基础,基本数据类型 boolean b = true; short si = 128; int i,j,k = -99; long l = 123456789; char ch = J; char chc = 中 ; float f = 3.1415926; double d = -1.04E-5; 直接分配内存空间; Java几乎是将字符串视为基本数据类型 String s = “你好!“; 扩展数据类型 类 数组,Java基础,定义类(新的数据类型) class MyDate int day; int month; int year; 定义对象 MyDate d1 ; d1 = new MyDate(); 动态分配内存空间:,47,Java基础,MyDate d1 = new MyDate() ;,d1.day = 28 ; d1.month = 12; d1.year = 70 ;,Java基础,String,char,Wrapper(包装)类,Java基础,包装类String Java语言将字符串作为对象来处理,每一个字符串常量是字符串类String的一个实例。 构造方法 方法 成员函数 构造方法初始化、与类同名 String()、String(String)、 String(char chars) 创建字符串 String s = new String(); /生成一个空字符串 String s = new String(“abc”); char data= a, b, c; String s = new String(data); String s = “abc”; /采用字符串直接定义获得内存空间,Java基础,int x=123; int y=x ; String s1=“abc” ; String s2 = s1 ;,null,x y s1 s2,“abc”,s2=“def”,Java基础,String s1 = new String(“abc”) ; String s2 = new String(“abc”) ;,0x01234567,0x12345678,s1 s2,“abc”,“abc”,s1 = = s2 false s1.equals(s2) true,Java基础,Java的字符串连接运算符 +,XXXXX,“abc”,s1,String s1 = “abc” ; s1=s1 + “def” ;,Java基础,方法 int length() / 返回字符串长度 例:“Java与面向对象程序设计”.length() 的值为13 char charAt(int index) /返回指定位置的字符 例: “Java与面向对象程序设计“.charAt(2) int compareTo(String s2) /按字母序进行字符串比较 boolean equals(Object obj)/判断字符串相等(区分大小写) boolean equalsIgnoreCase(String s2) /(不区分大小写) String toLowerCase()/将字符串所有大写字母转换为小写 String toUpperCase()/将字符串所有小写字母转换为大写,Java基础,String substring(int beginIndex) /取子串 String substring(int beginIndex, int endIndex) int indexOf(String str) /返回str在当前串中开始位置 int indexOf(String str,int fromIndex) boolean startsWith(String prefix) /判断该字符串是 否以prefix为前缀。 boolean endsWith(String suffix) /判断该字符串是 否以suffix为后缀。 char toCharArray() /将字符串转为字符数组,Java基础,int的包装类Integer 属性 static int MAX_VALUE 返回int型数据的最大值 static int MIN_VALUE 返回int型数据的最小值 构造方法 Integer(int value) Integer(String s) 方法 int intValue() double doubleValue() String toString() static String toString(int i) static int parseInt(String s) static Integer valueOf(String s),static - 静态的 类名.方法(属性);一般情况是对象名.属性,Java基础,利用类方法(静态方法) static int Integer.parseInt(“23”) static String Integer.toString(23) static double Double.parseDouble(“12.3”) static String Double.toString(12.3) 利用对象方法 Double d ; String s; / 声明 d= new Double(12.3) ; /创建 s= d.toString(); Double.valueOf(“12.3”).doubleValue() ; /返回,Java基础,数组在其他语言中是相同数据类型的元素的集合;而在Java中,数组是独立的类,有自身的方法,不是变量的集合 一个数组是数组类的一个对象。 数组是通过new运算符来动态创建,并分配与数组下 标数和维数、数组数据类型相匹配的内存空间。数组一经被分配了适当的空间,则其所有元素都初始化为默认值。 Java中,数组声明允许方括号跟在数组类型声明之后。 数组的声明 int intArray ; /( 不是指长度可变) int intArray;,Java基础,数组的长度不是在声明时指定,而是在创建时由所开辟的内存单元数目确定 数组的创建(3步) 数组的声明 创建数组空间 创建数组元素并初始化。若数组元素为基本数据类型,第三步可以省略;当数组元素为对象时,则必须对数组元素进行创建和初始化。 一维数组定义 int intArray; 数组类对象引用说明(intArray) 动态分配空间(new int 5 或数组初始化) int intArray = new int 5 ;,Java基础,创建方法: 先声明后创建 int intArray ; intArray = new int 10 ; 在声明的同时创建 int intArray = new int 10 ; 直接赋值 int intArray = 1, 2, 3, 4, 5 ;,Java基础,定义数组 Integer a; (注意此时为包装类) Integer b = new Integer5; 创建数组元素的对象实例 for(int i = 0; i b.length; i+) bi = new Integer(i*10); 创建数组时初始化 Integer d = new Integer(1), new Integer(2), new Integer(3);,Java基础,int intArray = 11, 47, 93, 26, 38 ; 分配空间+赋初值 静态初始化必须与数组定义放在一个语句中。 intArray = new int10 ; /原数组丢失 数组定义后还不能立即被访问,因为 还没有为其分配内存空间。数组必须经定义后再创建这一步才能使用,XXXX,intArray,软件工程与实践 第三讲 面向对象程序设计,大连理工大学创新实验学院,面向对象概述,什么是面向对象 术语“面向对象”是由英文Object Oriented翻译而来的,简称为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):方法是类的行为属性的总称。一个类可以有多个方法,表示该类所具有的功能和操作。通过对象调用类中的方法就可以改变对象域中变量的值。例如:自行车类具有加速和减速的方法,通过一个自行车对象调用加速方法就可以改变对象中保存当前速度的实例变量的值。,面向对象概述,程序设计过程 使用面向对象方法解决问题的过程可以大体划分为面向对象分析(Object Oriented Analysis,简称OOA)、面向对象设计(Object Oriented Design,简称OOD)和面向对象编程(Object Oriented Programming,OOP)三大步骤。 (1)面向对象分析(OOA)。面向对象分析的主要作用是明确使用程序的用户、用户可以进行的操作,以及数据的输入、输出和储存,并且用标准化的面向对象模型规范地表述这些内容,最后形成面向对象分析模型,即OOA模型。 在分析问题时,要抽取所有需要的对象实体,然后确定这些对象的状态和行为,以及它们之间的相互关系。一般来说,解决一个问题会涉及到多个对象,所以这些对象之间的关系一定要明确,从而反映出整个程序的功能和状态。例如:自动取款机程序的使用用户包括银行和用户,它有可能涉及到的对象包括用户、帐户、自动取款机和提款卡等等。,面向对象概述,程序设计过程 (2)面向对象设计(OOD)。面向对象设计是将在面向对象分析步骤中创建的OOA模型加以扩展并得到面向对象设计步骤中的OOD模型。 面向对象设计在OOA模型的基础上引入界面管理、任务管理和数据管理三部分的内容,进一步扩充OOA模型。界面管理负责整个系统的人机对话界面的设计,任务管理负责处理整个程序资源管理功能的工作以及设置客户与服务器之间的接口,数据管理负责设计程序与数据库的交换方式。 面向对象设计还需要明确每个类方法的参数、返回值、功能等,以及各类之间的相容性和一致性的验证,对各个类、类内成员的访问权限的严格合理性的验证,也包括验证对象类的功能是否符合用户的需求。例如:自动取款机的OOD模型要包括用户、帐户、自动取款机的人机对话界面设计,使用自动取款机的用户和自动取款机服务器之间的操作,自动取款机服务器与数据库之间的操作等等。,面向对象概述,程序设计过程 (3)面向对象编程(OOP)。面向对象编程就是具体的程序编写阶段,其主要过程是先选择一种合适的面向对象编程语言,再用选定的语言编写程序实现设计步骤中对各个对象的详尽描述,然后将编写好的各个类根据其关系集成为整个程序,最后通过各种实例测试找出程序的漏洞并改善程序,最终完成整个软件的开发。,面向对象概述,面向对象程序设计的特点 面向对象程序设计提高了软件的生产效率和程序模块的重复使用率,并且降低了维护成本。面向对象程序设计的主要特点是: (1)封装(Encapsulation):封装就是将对象的数据和基于数据的方法封装在一起成为一个整体类。所有的程序编写基本上都是通过创建类的对象,然后以对象为载体,进行数据交流和方法的执行。 封装是一种数据信息隐藏技术,使用者只需要知道对象中变量和方法的功能,而不必知道行为实现的细节,也就是说,类的使用者与设计者是分开的。此外,封装使得类的可重用性大为提高。 (2)多态(Ploymorphism):多态是指程序的多种表现形式。在同一个类中,同名但参数不同的多个方法(方法重载)是多态的一种表现形式。另一种表现形式是子类对父类方法的覆盖或者子类对抽象父类中的抽象方法的具体定义。,面向对象概述,面向对象程序设计的特点 (3)继承(Inheritance):继承是指一个类拥有另一个类的所有变量和方法。被继承的类称为父类,继承了父类的所有数据和操作的类称为子类。继承使得程序结构清晰,降低编程和维护的工作量。 (4)抽象(Abstraction):抽象是具体事物一般化的过程,即对具有特定属性的对象进行概括,从中归纳出这一类对象的共性,并从共同性的角度描述共有的状态和行为特征。 抽象包括数据抽象和方法抽象两个方面。数据抽象用来描述某类对象的共同状态;方法抽象用来描述某类对象的共同行为。,域和方法,域 我们在前面介绍过域是类或者对象的状态属性的总称。它可以是普通数据类型的变量,也可以是其他类的对象类型变量。域常见的有实例变量、静态变量和最终变量3种形式。分别介绍如下。 1实例变量 实例变量(Instance Variable)用来储存某个类对象的状态值。它必须在类内、任何方法外被定义,一般位于整个类语句体的最前端。其修饰符可以是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修饰变量被称为易失域,通常用于进行多线程编程。这种变量可以同时被多个线程控制和修改变量值。,域和方法,构造方法 构造方法(Constructor Method),也称为构造函数,是一种特殊的方法。在创建对象的同时,调用这个对象所属类的构造方法来完成对象实例变量的初始化。 构造方法的形式如下: public 类名( 参数 ) 语句体 其中的语句体为初始化实例变量的赋值语句,可以使用参数值作为变量的初值,也可以直接给变量赋具体的数值。 一般来说,构造方法具有以下几个的特点:,域和方法,构造方法 (1)构造方法的方法名与其所在类的名称相同。 (2)虽然构造方法没有返回值,但是也不能有void关键字。 (3)构造方法的修饰符总是public。 (4)构造方法的主要作用是完成对类对象实例变量的初始化工作。 例如,可以为People类增加一个如下所示的构造方法 public People() name = “沈昕“; age = 26; gender = F; height = 1.62; weight = 55.5; 在上面的构造方法中,一共给5个实例变量赋了初值。当调用该构造方法时,就可以完成对5个实例变量的初始化。,域和方法,构造方法 如果希望在创建对象时,其实例变量具有不同的初值,可以通过传递参数并将参数值赋给实例变量的方法来实现。构造方法的参数要与实例变量一一对应,例如:People类的另一种构造方法为: public People( String initName, int initAge, char initGender, double initHeight, double initWeight ) name = initName; age = initAge; gender = initGender; height = initHeight; weight = initWeight; 一般情况下,一个类中可以有一个或者多个构造方法,它们的方法名称相同但是参数不同,相当于方法的重载。我们将在后面具体介绍方法重载。,域和方法,方法 除了构造方法外,类中还有许多描述类行为的方法,这些方法可以分为实例方法和静态方法两种。 1实例方法 它属于每个对象,只能通过类的对象调用。实例方法用来定义某个类的行为,也就是说类的对象所能进行的操作。与实例变量一样,实例方法的修饰符可以是public或者private,但是不能用static。如果希望实例方法可以在类之外被访问,则使用public;如果希望实例方法只在类内被访问,则使用private。例如:在People类中,我们可以定义一个setName()方法用来改变People类某个对象的姓名,该方法内容如下。 public void setName( String newName ) name = newName; ,域和方法,方法 2静态方法 与静态变量类似,静态方法的本质是属于整个类的,而不属于某个实例对象。因为静态方法属于类本身,所以只要定义了类,它的静态方法就存在,就可以直接使用类来调用。 在使用静态方法时要注意以下几个问题: (1)使用static修饰的静态方法是属于某个类的,它在内存空间中的内容将随着类的定义而进行分配和装载,不被任何一个对象所单独拥有。 (2)静态方法不能操纵和处理属于某个对象的实例变量,而只能处理属于整个类的静态变量,也就是说静态方法只能处理静态变量或者调用静态方法。 (3)因为静态方法不能访问实例变量,所以在静态方法中不能使用关键字this。,域和方法,方法 2静态方法 (4)需要调用某个静态方法时,可以使用其所属的类的名称直接调用,也可以用类的某个具体的对象名调用,其形式为: 类名.静态方法名; 或者 对象名.静态方法名; Math类中的abs()、max()等方法,以及Integer类中的parseInt()方法等就是静态方法,直接用类名进行访问。 作为程序入口的main()方法必须要用static来修饰,也是因为Java运行时系统在开始执行一个程序前,并没有生成类的一个对象,它只能通过类名来调用main()方法作为程序的入口。,方法的使用,调用方法 在完成类程序的编写后,就可以在其他程序中创建该类的对象,并调用该类的实例方法。注意,类的程序和使用类的程序要保存在同一个目录下。 1调用构造方法 如果在定义类对象时没有定义任何构造方法,系统会自动产生一个构造方法,无需定义,称为默认构造方法。默认构造方法不带任何形式的参数,并且方法体为空。 例如,如果上面的People类没有定义构造方法,则系统产生的默认构造方法如下: People() ,方法的使用,调用方法 2调用实例方法 在调用某个类中的实例方法之前,要先创建该类的对象,然后通过该对象并且使用符号“.”来调用所要访问的实例方法。 例如,下面是某个程序中的两条语句。 People p1 = new People(); p1.setName( “李芳“ ); 其中,第一条语句是调用People类的第一种构造方法来创建对象p1,第二条语句是通过对象p1调用setName()方法来改变对象p1实例变量name的值。 class Pe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 经营单位安全管理制度编制纲要
- 2021年教师节颁奖典礼动态
- 颅脑损伤护理查房
- 恩派雅(N.Paia)品牌分析与二次增长战略报告
- 儿童电除颤教学课件
- 创意美术字教学课件
- 新解读《GB-T 36780 - 2018辣椒轻斑驳病毒检疫鉴定方法》
- 用电申请业务知识培训课件
- 贵州省黔西南州2024-2025学年高二下学期期末学业质量监测 化学试卷
- 急性乳突炎切开引流护理查房
- 失语症及治疗方法讲课件
- 热射病病人的急救护理
- 客运站安检设备管理制度
- U9-SCM-库存-Unit9-内部交易-V2
- 肠外营养个案护理
- CJ/T 94-2005饮用净水水质标准
- 2025-2030系统级芯片(SoC)测试机产业市场深度调研及前景趋势与投资研究报告
- 《化工和危化品生产经营单位重大生产安全事故隐患判定标准(细化版)》知识培训
- 2025年汉防己甲素项目市场调查研究报告
- 驿站快递合同协议书
- 《新型主动脉夹层护理策略》课件
评论
0/150
提交评论