Java面向对象程序设计(第三版) 第一章.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Java面向对象程序设计(第三版) 第一章.doc》由会员分享,可在线阅读,更多相关《Java面向对象程序设计(第三版) 第一章.doc(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1章 Java程序设计与开发1.1 概 述本章介绍Java程序设计与开发中需要用到的一些基本概念和技术。首先从确定设计面向对象程序的主要步骤开始。通过设计一个“提问”和“回答”的猜谜程序来阐述这些步骤。作为一个猜谜的例子,想一想“什么是黑和白并且可以读的?”的问题,答案当然是 报纸。在设计阶段之后,我们重点关注编写Java程序所需的步骤,这些步骤包括了编辑、编译和运行程序。由于有两种不同形式的Java程序应用程序(application)与小应用程 序(applet),所以我们将讲解编写这两类程序的不同之处。接下来,我们通过研究PrintStream和System类来熟悉Java的扩展类库。
2、使用这些类包含的对象和方法即可实现在程序中打印输出。在本章结束时,你将能设计并编写出一个能“唱”你最喜欢的歌的Java应用程序。1.2 设计优秀的程序编程并不仅仅只是简单地键入Java代码,而是需要进行大量的精心规划和设计。设计糟糕的程序几乎不可能正确运行。对于新手程序员来说,马上开始编码是非常有诱惑力的,下面给出程序设计的首要规则之一。Java编程提示:越早开始编码,完成程序所需的时间就越长。在编码之前必须进行精心的设计,对于面向对象的程序来说,尤其如此。换句话说,设计程序时投入的思考和注意力越多,就越有可能得到一个可以正确运行的程序。下面这些小节将对程序开发过程做一个简要的说明。软件工程生
3、命周期软件工程是指设计和实现软件的过程。软件生命周期指的是在设计和开发一个计算机程序时所经历的不同阶段。本书所举的例子将集中讨论整个生命周期的4个阶段。在分析阶段,我们提供了对某个问题的综述并详细说明了这个程序将要完成什么功能。在设计阶段,我们对程序中将要使用的各种各样的类、方法以及数据进行详细的说明。实现阶段指的是编写Java程序源代码的过程。在测试阶段,我们将测试程序的运行性能以确保它是正确的,如果有必要,将重新设计或编写这个程序。图1.1对程序开发过程做了更详细的介绍,主要集中在软件生命周期的设计阶段。它表明设计一个面向对象的程序是对组成程序的各种类、数据和方法提出正确问题的过程。总之,
4、程序开发过程可以看作是一个反复应用分而治之原则的过程,因为大多数编程问题可以反复分解,直到成为许多相对容易解决的子问题,每一个子问题对应于一个对象。通过使用这种方法,一个程序可以分解成一组相互作用的对象,然后再为每一个对象设计一个类。在设计类的时候,每个对象进一步分解成只包含属于它自己的变量和方法。图1.1 程序开发过程一览什么时候停止进一步的分解呢?一个对象或者方法应该分配多少个任务?要回答类似的问题并不容易。好的答案来自于丰富经验所产生的良好判断力,而且好的解决方案经常不止一个。再次强调,随着我们学会更多关于面向对象设计的知识,我们也将学会如何更好地做出设计决策。1.3 设计一个猜谜程序程
5、序开发过程中的第一步就是确保你知道需要解决哪些问题(图1.1)。因此,我们从制定详细的规则开始,这将解决以下3个基本问题:l 到底要解决什么问题?l 程序将如何使用?l 程序将表现出哪些行为?在现实世界中,问题分析经常开始于开发者与客户深入讨论之后。在程序设计入门课程中,这种分析通常由教师给出。为了让这种思路更清晰,我们来为这个简单的问题设计一个面向对象的解决方案。问题规范:设计一个类来表示一个带有问题和答案的谜语。这个类的定义应使它可存储不同的谜语,并能够分别获得谜语的问题和答案。1.3.1 问题分解大多数问题都由于太大、太复杂而不能一次性解决掉。因此,设计过程的下一步就是将问题分解成多个部
6、分,这样可以更好地管理其解决方案。在面向对象的方法中,一个问题被分解成多个对象,每个对象只处理本程序整体任务中的一个特定方面。这样,每个对象就成为程序的整体行为中某一方面的内行或专家。注意,在对一个给定的程序进行分解时,到底要分解到哪一步并不明确。这种不确定性源于过程设计本身。在一个程序的所有部分变得“简单到可以解决”之前,我们要把它分解到什么程度?这取决于试图解决的问题和解决问题的人。下面是一条有用的设计指导原则,可以用来决定在程序中需要哪些对象。高效设计:寻找名词。选择程序的对象通常就是寻找问题分析中的名词。同样,这条指导性原则也存在不确定性。例如,当前问题中的关键词是谜语,所以解解决方案
7、中包含一个作为谜语模型的对象。这个Java对象的主要任务是表示一个谜语。问题分析中的另两个名词是“问题”和“答案”。幸运的是,Java带有内置的String对象,它用来表示一个字符串,如一个单词或句子。我们可以用两个String对象来代表谜语的问题和答案。因此,对于这个简单问题,我们只需要设计一个新类型的对象,即谜语,其主要目的是表示谜语的问题和答案。如果觉得设计决策在这个阶段显得很神秘,不用担心。只有具备丰富的设计经验之后,才能很好地理解面向对象设计,但这是一个好的起点。1.3.2 对象设计一旦把一个问题分解成一组相互协作的对象后,设计Java程序主要就是设计和创建这些对象本身。这意味着在这
8、个实例中,我们必须设计谜语对象的特征。对于每个对象,必须回答下面这些基本设计问题:l 对象在程序中扮演什么角色?l 对象需要什么数据或信息?l 对象将执行什么行为?l 对象为其他对象提供什么接口?l 对象向其他对象隐藏了哪些信息?就谜语对象来说,这些问题的答案在图1.2中给出。注意,虽然我们说“设计一个对象”,但实际上是在设计对象的类,一个类定义了属于它的对象集合。类可以看作是对象的类型,这与真实世界的对象一样。这样,seabiscuit(世界上速度最快的纯种马之一译者注)是马,也就是说,seabiscuit是马类型的一个对象。类似地,一个单独的谜语,例如报纸谜语,是个谜语,也就是说它是谜语类
9、型的一个对象。l 类名:Riddlel 角色:存储、获取问题、答案l 属性:(信息)- question:用来存储谜语问题的变量(private)- answer:用来存储谜语答案的变量private)l 行为- Riddle():用来设置谜语问题和答案的方法- getQuestion():用来获取谜语问题的方法- getAnswer():用来获取谜语答案的方法图1.2 谜语类的设计分析下面的讨论表示了怎样得到如图1.2所示的Riddle类的设计分析。Riddle对象的作用是建立一般谜语的模型。因为一个谜语是根据它的问题和答案来定义的,所以Riddle对象需要用某种方式来保存这两条信息。正如我
10、们在第0章所学,实例变量(instance variable)属于一个对象的命名内存区域。这样,通过调用变量的名字就能很容易地获取所存储的数据。例如,为打印谜语问题,我们可以说“print question”,这样,存储在问题中的内容就会被获取并被打印出来。通常,实例变量用来保存对象在完成其任务所需的信息。它们与我们前面所说的对象属性相对应。确定这些变量相当于回答这样一个问题:这个对象需要什么信息?接着决定一个谜语对象要执行什么动作。下面给出另一个有用的指导原则。高效设计:寻找动词。选取对象的行为往往是在问题分析的过程中寻找动词。就这个问题而言,关键的动词是赋值和获取。如图1.2所表示的,每个
11、Riddle对象应该提供能对问题和答案的变量进行赋值的方法,分别获取变量值的方法。每个已经确定的动作都将封装在一个Java方法里。在第0章中曾讲过,方法(method)是一段命名的代码,可以调用它来执行特定的动作。在面向对象的方法中,方法调用是不同对象之间进行交互的方式。调用一个方法就像在对象之间传递信息,例如,当我们想要得到谜语的答案时,就会调用getAnswer()方法。这类似于发出一个信息“给我答案”。当一个对象被创建时,一个称为构造函数的方法会被自动调用。我们将用这个构造函数Riddle()来对谜语的问题和答案赋初值。在设计对象时,必须确定哪些方法可以被其他对象调用。这就决定了对象要提
12、供什么样的接口,而对其他对象又应该隐藏什么信息。一般来说,用于和对象通信的方法被指定为对象接口的一部分。除了它的接口以外,每个谜语所维护的所有其他信息均应对其他对象保持隐藏状态。例如,其他对象没有必要知道一个谜语对象如何存储问题和答案。存储问题和答案的变量命名为question与answer,而不是ques与ans,这一点与其他对象无关。高效设计:对象接口。对象的接口应该包括与对象通信所需的方法或使用对象的方法。 高效设计:信息隐藏。对象应该隐藏其实现的大部分细节。综上所述,根据这些不同的设计决策而得出的分析结果如图1.3所示。如我们的讨论所阐明的那样,通过恰当地提出并解答问题来形成决策。在大
13、多数情况下,属性(变量)是私有的,在它们的前面用一个减号(-)来表明。在这个例子里,操作(方法)是公共的,在它们的前面用一个加号(+)来表明。此图表示Riddle类有两个隐藏的(或私有的)变量用于保存数据,还有三个可见的(或公共)方法用于表示它能执行的操作。图1.3 表示Riddle类的UML类图1.3.3 数据、方法与算法完成谜语对象的需求分析之后,下一步是确定所需的数据、方法和算法。这需要回答下面两个基本问题。l 需要用哪种类型的数据来表示谜语所需的信息?l 每个方法怎样执行指定的任务?与其他程序设计语言类似,Java提供了丰富的数据类型,有些很简单,有些很复杂。显然,谜语的问题和答案应该
14、用文本类型来表示。正如我们前面所提到的,Java的String类型设计用来存储文本,它也可以用来表示字符串。在实现一个方法时,必须决定该方法要做什么。为了执行它的任务,一个方法需要某些保存在变量里的信息。另外,它还必须按顺序执行一系列活动来完成任务。这称为算法,它是对逐步解决问题的过程的描述。最后,必须确定该方法会产生什么结果。因此,在设计对象时,正确解决下面这些问题将非常重要:l 这个方法具体完成什么任务?l 它完成任务需要什么信息?l 它将使用什么算法?l 它会产生什么结果?方法可以看作是使用一种算法来完成所要求的行为。构造函数Riddle()所需的算法虽然很简单,但对于很多类的构造函数而
15、言,它是很典型的。它使用了两个字符串,并把第一个赋给实例变量question, 把第二个赋给实例变量answer。Riddle类的其他两个方法所用的算法更简单,它们称为“get”方法,仅仅是返回或产生当前保存在实例变量中的数据。并不是所有的方法设计起来都这么简单,也不是所有的算法都这么浅显易懂。甚至在设计一个简单的数学问题的程序时,它的算法所需的步骤并不总像手工计算时那样明显。例如,假设有一个求一组数字的和的问题。我们可以说,“把所有的数加起来并报告它们的总和”。但是,这种描述要用在程序中就显得含糊不清。作为对比,下面给出了一个程序可能使用的算法。1. 将总和(sum)初始化为0。2. 如果没
16、有更多的数字要累加,转到第5步。3. 将下一个数加到总和(sum)中。4. 转到第2步。5. 报告总和。这个算法中的每一步都很简单而且容易实现。把它翻译成Java语言比较容易。因为用英语来描述算法总是不那么精确,程序员经常用伪码(pseudocode)或直接用程序设计语言来写算法。伪码是一种结合英语与程序设计语言的结构的混合语言,它没有程序设计语言那样琐碎的语法。例如,前面的算法可以用伪码表示如下:sum = 0while (more numbers remain) add next number to sumprint the sum当然,一个有经验的程序员不可能花时间为这么简单的程序写伪码
17、,但许多程序设计问题非常复杂,需要精心设计,以尽可能减少程序中包含的错误。在这种情况下,伪码就显得非常有用了。算法设计的另一部分工作是用一些抽样数据来跟踪它的执行过程。例如,我们可以用下面的一组数据来跟踪数列求和算法的执行过程,以便对它进行测试。总和数列 0 54 8410454 30 20 30 20 20 起初,总和为0而数列中有54,30和20这些数字。在算法的每次循环中,总和逐个添加下一个数字的值,而数列中的数字个数减少。这样,算法终止时就可得到总和的正确结果。虽然这次跟踪没有发现任何错误,但用这种方法来跟踪算法的执行过程时极可能发现错误。1.3.4 用Java编写代码一旦完成足够详细
18、的设计,就可以开始编写Java代码了。立即输入整个程序,然后编译并运行,这种做法是错误的,这通常会导致许多难以改正且令人沮丧的错误。正确的编码方法是采用逐步求精(stepwise refinement)的原则,把程序分成若干小段来编写,每完成一小段就编译并测试它。例如,你可以先写出一个方法并测试它,然后再写程序中其他的部分。用这种方法,在继续下一步之前可以把那些小错误找出来。Riddle类的代码如图1.4所示。即使我们还没有开始学习Java语言的细节,也可以轻松地找出程序的关键部分:String类型的实例变量question与answer,用来保存谜语的数据;Riddle()是构造函数,get
19、Question()和getAnswer()方法组成了它的接口。本章和下一章将介绍理解这些内容所需要的相关语言细节。/ * * File: Riddle.java * Author: Java, Java, Java * Description: Defines a simple riddle. * /public class Riddle extends Object / Class header / Begin class body private String question; / Instance variables private String answer; public Rid
20、dle(String q, String a) / Constructor method question = q; answer = a; / Riddle() public String getQuestion() / Instance method return question; / getQuestion() public String getAnswer() / Instance method return answer; / getAnswer() / Riddle class / End class body图1.4 Riddle类的定义1.3.5 语法和语义要编写Java代码
21、,需要知道它的语法和语义。语言的语法(syntax)是判断特定语句的格式是否正确的一套规则。举一个说明语法规则的例子,看一看下面两句话:The rain in Spain falls mainly on the plain. / ValidSpain rain the mainly in on the falls plain. / Invalid第一句话遵循英语语法的规则,它的意思是西班牙平原下了很多雨。第二句话没有遵循英语语法,因此,它表达不了任何意义。Java语法规则的一个例子是每个Java语句都必须以分号结束。在英语中,即使违反语法规则,别人仍然可以理解你,但是在编程语言中,语法规则非常
22、严格。可能你只违反了一条很小的语法规则,例如,忘了一个分号,程序也不会运行。类似地,程序员必须知道语言的语义,即每条语句的意思。在程序设计语言中,语句的含义取决于它将对程序产生什么影响。例如,在前面的算法中,要把sum初始化为0,就需要用一条赋值语句来把0值存储到名为sum的特定内存区域内。因此,我们说以下 语句:sum = 0;把0值赋给特定内存区域sum,它将保存在那里,直到程序中的其他部分需要它。学习Java的语法与语义是学习程序设计的主要内容。在这方面,学习编程与学习外语非常相似。越快学会并熟练地使用新语言(Java),就能把那些有趣的程序设计问题的解答表达得越好。在掌握Java的规则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java面向对象程序设计第三版 第一章 Java 面向 对象 程序设计 第三
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内