javachapter6(带作业题).ppt

上传人:本田雅阁 文档编号:2201773 上传时间:2019-03-03 格式:PPT 页数:40 大小:531.51KB
返回 下载 相关 举报
javachapter6(带作业题).ppt_第1页
第1页 / 共40页
javachapter6(带作业题).ppt_第2页
第2页 / 共40页
javachapter6(带作业题).ppt_第3页
第3页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《javachapter6(带作业题).ppt》由会员分享,可在线阅读,更多相关《javachapter6(带作业题).ppt(40页珍藏版)》请在三一文库上搜索。

1、第六章 面向对象设计,主要内容: 6.1 软件开发活动 6.2 识别类和对象 6.3 静态类成员 6.4 类间关系 6.5 接口 6.6 枚举型类 6.7 方法设计 6.8 方法重载 6.9 测试 测试的目的是发现错误,错误是不能避免的! 6.10 GUI设计 6.11 布局管理器 6.12 边框 6.13 容器层次结构,5-2,软件开发活动,建立软件需求 调研看看问题是什么? 软件设计 分析、设计考虑如何去解决? 实现软件设计 编码解决、实现 软件测试 测试与维护,软件开发项目包含四个基本开发过程,3,软件需求 软件需求规定了一个程序必须完成的功能,指明了程序应当执行的任务,而不是描述如何执

2、行所规定的任务,通常用一个称为功能说明的文档来描述。 软件设计描述了程序将如何完成需求所指定的任务,并定义了程序中的类和对象、类间关系及类之间如何交互。底层的详细设计将解决各个类的方法如何完成自己的任务。 软件设计的实现是编写解决实际问题的源代码的过程。是将设计转换成某种程序设计语言的行为。 软件测试是保证软件能解决预定问题,并能够再满足性能要求的条件下执行任务。测试工作包括针对不同的输入数据多次运行程序和精确分析程序执行结果。,4,6.2 识别类的和对象 面向对象软件设计的基本内容就是确定类,类决定软件的结构。 6.2.1 类的识别方法 识别可能的类的方法之一是:识别软件需求中所讨论的实体对

3、象。对象一般是名词。 问题说明中的名词可能标识了程序中需要的一些类和对象 通常用一个名词给代表对象的类命名。一个类代表一个实体,根据类可以建立程序所需要的任意多个实例。 类识别时候还要处理一个问题: 是将某一事物表示为一个对象还是另一个对象的基本属性。 6.2.2 类职责的分派 类职责的分派是软件设计工作的一部分,每个类代表一个具有某些行为的对象,对象的行为由这个类的方法定义。 类的行为所执行的动作体现了程序的功能,因而通常使用动词来给行为和完成行为的方法命名。,5-5,静态类成员(Static Class Members),For example: Math类中的静态方法 result =

4、Math.sqrt(25); 下面我们着重学习 静态变量(static variables) 静态方法(static methods),5-6,静态变量(static variables),private static float price; private static int count; 静态变量由类的所有实例共享; 程序第一次引用含有静态变量的类时,将静态变量分配存储空间; 在方法中声明的局部变量不能具有静态属性。 Java程序的main方法必须用static修饰符进行说明,使解释器执行main方法时,不用实例化含main方法的类。,5-7,静态方法(static methods),

5、class Helper public static int cube (int num) return num * num * num; ,由于方法cube是静态的方法,因此可以用类名直接调用它: value = Helper.cube(5);,静态方法可以通过类名来引用。因此调用静态方法不需要实例化类的对象。静态方法不能引用实例变量,静态方法可以引用静态变量。,Java程序的main方法必须用static修饰符进行说明,使解释器执行main方法时,不用实例化含main方法的类。,例:6.1,6.2,8,6.4 类间关系 类之间最基本的关系是:依赖、聚合和继承。 6.4.1 依赖关系 类之间

6、的依赖关系通常体现在一个类的方法调用另一个类的一个方法。 一般而言,如果类A使用类B,则在类A中由一个或者多个方法调用类B中一个或者多个方法。如果被调用的方法是静态方法,则类A只需要通过类名引用B,如果被调用的方法是非静态的,则A必须通过访问类B的实例来调用该方法。 一个对象获得对另一个类的对象访问控制的方式,是软件设计中的重要决策。,9,6.4.2 同一个类的对象之间的依赖性 即一个类对象与本类的其他对象交互。要实现这一操作,可以将一个类的对象作为一个参数传递给本类的一个方法,使得该方法可以对作为参数得到的对象进行操作。 例如: str3 = str1.concat( str2) ; 例题

7、6.3 例题 6.4,10,6.4.3 聚合(has a )关系 一个聚合对象由其他的对象组成,形成一个”has a”关系 一个聚合对象的定义是:将其他对象的引用作为自己的实例数据的对象。 聚合关系是依赖关系的特殊类型,即类A被类B定义为类B的一部分时,类A便依赖类B,类B就是聚合类。 一个聚合类通常要调用其组成部分类的方法。 例题 6.5 例题 6.6 例题 6.7,11,6.4.4 this 引用 page: 213214 this是java的保留字,this引用允许对象引用自己。 一个非静态方法需要通过一个具体的对象或类来引用,this引用可用于引用当前正在运行的对象。 this引用也常

8、用于区分同名的构造方法参数和实例方法。 例如: public Account (string owner, long account, double balance) name =owner; acctNumber = account; balance = balance; public Account (string name, long acctNumber, double balance) this.name =name; this.acctNumber = acctNumber; this.balance = balance; ,12,6.5 接口 接口表示一组公共的方法,通过这组方法

9、可以与一个对象交互。 一个Java接口是一组常量和抽象方法的集合。 抽象方法是没有实现的方法,即对于抽象方法没有已定义的实现代码,包含参数列表的方法声明头后面仅跟这一个分号。 一个接口是抽象方法的集合,因而不能被实例化。 例题 6.8 抽象方法声明前使用保留字abstract,但是在接口中的方法通常不需要加上abstract。 接口方法的默认可见性是public。 一个类通过实现定义在接口中的每个抽象方法来实现这个接口。,13,实现接口类(实现类)在类声明头部使用保留字implements,接着再给出接口名。 一个类声明它要实现某个接口,它就必须提供这个接口所有方法的实现代码。如果接口中的任何

10、一个方法在这个类中没有实现代码,编译器将产生错误信息。 例题 6.9 例题 6.10 接口要求一个实现类应实现接口特定的方法,同时允许实现类还可以由其他的方法。 可以由多个类实现同一个接口,由此可对相同的方法进行不同的实现。-“多态性”,14,一个类也可以实现多个接口,在这种情况下,这个类应提供所有接口种所有方法的实现代码。 使用implements字句声明一个类实现多个接口,接口名用逗号分隔开。 class ManyThings implements interface1,interface2,interface3 /contain all methods of all interfaces

11、 ,15,6.5.1 Comparable接口 该接口定义在java.lang包中,该接口中只有一个方法compareTo,该方法的参数是一个对象,返回值为整型值。 Comparable接口的目的是提供对两个对象进行比较的通用机制。 例如: if (pareTo(obj2) 0) system.out.println (“obj1 is less than obj2”); 6.5.2 Iterator接口 也定义在Java标准类库中,由代表一个对象结合的类使用,主要提供了在一个对象集合中每操作一次移动到下一个对象的方法。 该接口中的两个方法是hasNext和next方法。,16,6.6 枚举型

12、类 枚举型定义了一种新的数据类型,列出了所定义类型的所有可能取值。 例如: enum Season winter,spring,summer,fall Season time; /声明Season类的一个对象。 枚举型是一种特殊的类,枚举型的值是对象。 一个枚举型的值是具有该枚举型的静态变量。 对变量time赋值如下: time = Season.spring; 例题 6.11 例题 6.12,17,6.7 方法设计 对方法的设计将决定类如何具体确定定义自己的行为。 本节讨论的两个最重要的问题: 方法分解和对象作为方法参数时所涉及到的有关概念 6.7.1 方法分解 一个对象提供的服务如果太复杂

13、,而不能用一个方法来实现这个服务的时候,一般需要将一个方法分解为多个方法,使得软件设计更容易理解。 例题 6.13 例题 6.14,18,6.7.2 方法参数的传递方式 Java中,所有参数以传值的方式传递,也就是调用方法时实际参数的当前值将复制给方法声明头的形参。 参数的传递实质上是将实参保存的值的副本给形参。在方法内部任何对形参的修改不会影响实参。 当将一个对象传递给一个方法时,传递的时这个对象的引用,复制给形参的值是对象的地址,因此形参名和实参名相互成为对方的别名。 通过被调用方法内的形参引用而改变了对象的状态,也同时改变了由实参引用的对象,因为形参和实参引用的是同一个对象。 如果改变形

14、参引用本身,则不会影响实参,实参仍然指向原对象 例题 6.15 例题 6.16 例题 6.17,19,6.8 方法重载 在Java中使用具有不同参数表达的相同方法名调用多个方法的技术叫做方法重载。 当需要对不同类型的数据执行类似的方法时,该技术非常实用。 多个重载方法可以由方法的参数个数、类型及参数顺序来区分。 例如 声明两个方法。 Public int sum (int num1, int num2) return num1+ num2; Public int sum (int num1, int num2, int num3) return num1+num2+num3;,20,当调用su

15、m方法时,编译器将根据调用参数的个数确定执行那个版本的sum方法 例如:sum (25, 69, 13); 方法名及方法的参数个数,类型和顺序称为方法的签名。 编译器根据完整的方法签名,将一个方法调用和适当的方法定义代码绑定在一起。 编译器必须能够检查方法调用时的方法签名以确定应该调用的方法,如果试图指定两个具有相同签名的方法,编译器将发出方法调用不适当的错误信息并且不产生可执行程序代码。 方法的返回类型不是方法签名的组成部分。即两个重载方法的差别不能仅仅只是返回值的类型不同,因为方法的返回值可以被调用语句忽略, 构造方法也可以重载,并且经常被重载。通过提供多种版本的构造方法,使得创建对象的方

16、式多样化。,21,6.9 测试 测试是针对不同的输入数据运行已完成编码的程序并发现程序问题的活动。 测试还包括系统评价工作,即有人或机器完成的,对改进系统质量的评估。 测试的目标是发现错误,通过发现错误并修正错误,逐步提高程序质量。 6.9.1 审查 用于评价设计和代码的技术叫审查。 审查的目的是发现问题,而不是解决问题。 进行审查时,应当考查设计是否完整考虑了所有的需求,并且还要对系统分解为类和对象的方法进行评估。 代码审查时候,应当考查设计是否忠实地满足需求,以及代码如何忠实地实现设计。 审查的任务是指明任何会引起设计或实现不能力行其职责问题。,22,6.9.2 缺陷测试 测试的目的就是为

17、了发现错误,因此常称为缺陷测试。 一个成功的测试应该是能够发现程序任何中任何不完善问题的测试。 一个测试用例由一组输入数据、用户操作或其他初始条件以及期望输出构成。 应该将测试用例形成规范的文档,以便将来需要时能够进行重复测试。 开发者应该建立一套完整的测试方案涵盖系统各个方面的测试用例组成。测试用例要精心设计和选择。 两种缺陷测试的方法: 黑盒测试和白盒测试。,23,黑盒测试 黑盒测试基于输入和输出数据,对于一个完整的系统,可以用黑盒测试技术进行测试,测试用例中的输入是用户提供的信息和用户的操作。当输入产生了预期的输出,测试用例是成功的。 黑盒测试用例通常可以由系统的需求分析或方法的功能描述

18、直接导出。 黑盒测试用例的输入数据通过定义等价类来选择,等价类是一个期望能产生类似输出信息的输入集。 等价类由边界值定义:因为一个等价类中所有值实质上在测试系统的统一特征,所以需要等价类边界值中的一个测试用例。 程序设计出错常发生在边界或者靠近边界的值,因此要对于边界值或者靠近边界的值应该进行穷尽测试。,24,一组好的测试数据至少应包括:准确的边界值、边界值减1和边界值加1,此外还应该定义些测试用例,输入数据不仅要包含上述的边界值,还要从等价类中至少取一个值。 白盒测试 也称为玻璃盒测试,用于测试一个方法的内部结构盒实现。 白盒测试用例基于代码逻辑。 白盒测试的目标是保证程序中的每一条路径至少

19、执行一条。 一个白盒测试映射代码所有可能的路径,并确保测试用例能引起每条路径得以执行,这类测试常被称为语句覆盖。 在黑盒测试和白盒测试中,应该在执行测试之前先预测一个测试得期望输出。,25,6.10 GUI设计 GUI设计的过程就是将关于组件、事件和其他语言的知识运用的过程。 GUI程序设计基本思想: 了解用户 预防用户犯错误 优化提供给用户的功能 设计保持一致性。,26,6.11 布局管理器 组件、事件和监听器等是GUI的核心组成,GUI设计中最重要的是使用布局管理器。 布局管理器是一个对象,负责在容器中安排组件,决定每个组件的大小与位置。 每当需要改变容器组件的视觉外观,都需要询问布局管理

20、器。 Java标准库中预定义的几种布局管理器。 布局管理器列表 每个容器有一个默认的布局管理器,但是用户可以根据喜好更换。可以调用容器的setLayout方法改变容器的布局管理器。 例如:将默认的流式布局管理器改变为边界布局管理器 JPanel panel = new JPanel() ; Panel.setLayout( new BorderLayout();,27,布局管理器列表,28,下面的例子主要介绍不同的布局管理器的应用 程序LayoutDemo主要介绍了标签窗格(tabbed pane)组件的使用 标签窗格式是一种容器组件,包含多个窗格,能根据用户的选择决定那个窗格成为当前可见的窗

21、格。 标签窗格在JTabbedPane类中定义 使用addTab方法创建一个标签时,可以指定该标签上显示的名称,以及相应的窗格移到顶层获得焦点,而可见时候显示组件。 实例程序中,标签窗格的每一个标签中包含一个使用不同的布局管理器控制的面板。 例题 6.18 例题 6.19,29,6.11.1 流式布局管理器 JPanel 默认情况下使用流式布局管理器。 流式布局管理器按组件的初始尺寸显示他们,并将尽可能多的组件放在一行。 当某一个组件在该行放不下时,将被放到下一行显示,行数会根据加到容器中的组件的多少自动增加。,30,例题 6.20 程序说明: 该实例是描述了LayoutDemo程序中演示的流

22、式布局管理器的面板。该面板显示地设置使用流式布局管理器,然后将创建各个按钮并将其增加到面板中。 程序中重载了FlowLayout类的构造方法可以方便程序员按需要定制布局管理器的特征 组件的对其方式右居左、居中、居右,默认情况下是居中对齐,还可以在创建布局管理器的时候设置组件间在水平方向和垂直方向的距离。,31,6.11.2 边界布局管理器 边界布局有五个区域加入组件:东区、南区、西区、北区、中心区。,北区,西 区,中心区,东 区,南 区,32,由边界布局管理器控制的容器的add方法的第一个参数是要加入的组件,第二个参数指定组件加入的区域。 在BorderPanel类的构造方法中,显示地将面板的

23、布局管理器设置为边界布局管理器。然后创建个按钮并将它加入到指定的区域。 边界布局中的每个区域中只能显示一个组件。 可以将多个组件加入到一个面板中,再将此面板加到边界布局的某个区域中。 默认情况下边界布局的各个区域之间是没有间隙的,间隙值可以在边界布局管理器类中使用重载的构造方法或调用显示的方法进行设置。 例题 6.21,33,6.11.3 网格布局管理器 网格布局管理器将容器中的所有组件显示在一个纵横排列的矩形网格中,组件被置于某个网格单元中,并且所有的网格单元大小相同。 网格的行数和列数可以 在创建布局管理器的构造 方法中通过参数指定。 系统将组件按照从左到右,从上到下的顺序依次填充到网格中

24、,系统没有提供方法显式地将某个组件放到网格的指定位置。 每个网格单元的尺寸由容器的总尺寸决定的。当容器改变时,所有的单元尺寸按比例改变以充满容器。 用于指定行数或列数的参数为0,网格将会在该行或列的方向按需要扩展以便容纳加入的所有组件。但行数或者列数不能同时为0。,34,默认情况下,网格单元间在垂直和水平方向上都没有间隙。间隙尺寸可以在GridLayout类中通过重载构造方法或者调用相应的方法进行设置。 例题 6.22 6.4.11 盒式布局管理器 盒式布局管理器将所有组件水平地布局在一行上或是垂直地布局在一列上。,35,创建BoxLayout对象时,使用在BoxLayout类中定义的常量来指

25、定它时沿水平方向还是沿垂直方向排列组件。 BoxLayout类对象构造方法的第一个参数是由它管理的组件,因此对每一个组件都必须创建一个新的BoxLayout对象。 使用盒式布局管理器的容器按照组件加入到容器的顺序从上到下或是从左到右排列组件。 在盒式布局中,组件之间是没有间隙,它不能为整个容器设置全局的垂直或水平间隙值,但可以在容器中增加不可见组件(invisible component)占据其他组件之间的空间。 在BoxLayout类中使用两种不可见的组件: 尺寸固定的刚性区域(rigid area)组件 可充满容器某部分额外空间的粘贴(glue)组件。,36,刚性区域使用Box类中的cre

26、ateRigidArea方法创建,其参数是一个Dimension对象,用于指定不可见的区域大小。 粘贴组件分别使用相应的createHorizontalGlue或createVerticalGlue方法创建。 当容器尺寸发生变化时,按钮之间的刚性区域的大小保持不变,而粘贴组件则会根据需要扩大或者缩小以填充可用空间。 盒式布局管理器会考虑它管理的组件的对齐方式,以及最小,最大和初始尺寸,可以通过设置加入到容器中组件的参数来定制可视化效果 。 例题 6.23,37,6.12 边框 Java中允许在任何Swing组件周围添加边框(border).边框不是组件的一部分,而是根据定义绘制的边界。,38,

27、BorderFactor类有助于为组件设置边框。它有创建各种边框的多个方法,调用组件的setBorder方法可以为其设置边框。 例题 6.24 6.13 容器层次结构 每个容器都可以有自己的布局管理器。一个图形用户界面程序的最终外观就是每个容器选择的布局管理器以及容器层次结构的综合体现。 一个特定程序的容器层次结构可以表示为一个树状容器,树的根是一个顶层容器。树的每层显示了包含在上一层容器中的容器于组件。 当程序中出现可能影响组件的视觉布局的变化时候,会依次询问每个容器的布局管理器。,39,练习,作业题(下一页有作业题目截图) EX6.6, EX6.7, EX6.8, EX6.9 (将这四题的解答写在一个程序文件中) EX6.17,40,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1