Java面向对象程序设计(第三版)第一章.doc

上传人:doc321 文档编号:14946790 上传时间:2022-02-25 格式:DOC 页数:32 大小:783KB
返回 下载 相关 举报
Java面向对象程序设计(第三版)第一章.doc_第1页
第1页 / 共32页
Java面向对象程序设计(第三版)第一章.doc_第2页
第2页 / 共32页
Java面向对象程序设计(第三版)第一章.doc_第3页
第3页 / 共32页
Java面向对象程序设计(第三版)第一章.doc_第4页
第4页 / 共32页
Java面向对象程序设计(第三版)第一章.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Java面向对象程序设计(第三版)第一章.doc》由会员分享,可在线阅读,更多相关《Java面向对象程序设计(第三版)第一章.doc(32页珍藏版)》请在三一文库上搜索。

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的规则

23、和惯例方面花的时间越多,你就越难用一种普通的语言表达清楚一个问题。还有,计算机对语言正确性的要求比人类苛刻得多,即使是最小的语法错误或语义错误也可能导致巨大的失误。因此,要尽最大努力非常准确地掌握Java的语法与语义。1.3.6 测试、调试与修改编写、测试与修改程序是一个循环反复的过程,这就要求你不断重复图1.1所示的程序开发过程中的不同阶段。根据逐步求精的原则,该过程应该按小增量步骤进行开发,这样,每一步结束后,问题的解答就会变得更细化一点。然而,无论多么小心,在编码过程中还是可能出错。语法错误是违反Java语法规则的错误。Java编译器可以查出代码中的任何语法错误,一旦明白了编译器给出的错

24、误信息,改正语法错误就相对容易一些。只要程序还有语法错误,程序员就必须改正它们并重新编译。如果所有的错误都被改正了,编译器将产生一个可以运行的可执行文件。在程序运行时,计算机按程序指定的步骤执行并产生结果。然而,一个程序能运行并不意味着它能工作并可以得到正确的结果。一个可运行的程序有可能包含语义错误(semantic error),也叫逻辑错误(logical error),语义错误是由程序逻辑设计中的错误引起的,它使程序不能正确运行,产生的结果也不正确。与语法错误不同,语义错误无法自动检测。例如,假设一个程序包含下面用来计算矩形面积的语句:return length + width;由于我们

25、把长与宽相加而不是相乘,得到的结果肯定是不正确的。但是表达式length+width没有任何语法错误,所以编译器不会检测到这条语句里的错误。这样,计算机将执行这条语句并计算出不正确的面积结果。语义错误只能通过测试程序来发现,而且有时它们是非常难以检测的。因为在一个测试中程序能正常运行并不能保证程序中不存在语义错误。一个程序看起来能够正常运行,可能只是因为它还没有经过足够多的测试。检测到语义错误时,必须找出它们并进行改正,程序设计的这个阶段称为调试。出现细微的错误时,程序调试是整个程序设计过程中最令人头疼的阶段。本书提供的各种各样的实验练习将给出如何查找代码中的bug的提示与建议。在查找这些细微

26、的缺陷时,要牢记一点,不管你多么相信自己的代码是正确的,多么确信那个bug是计算机的某种错误引起的,几乎都可以肯定那个错误是由代码所引起的。Grace Hopper和第一只计算机bug海军少将Grace Hopper(19061992)是一位计算机程序员先驱,并且是COBOL程序设计语言最初的开发者之一,COBOL代表通用的面向商业语言。除了她的成就和声望之外,Hopper少将还创造了computer bug这一术语。1945年8月,她和其他的一些程序员正在Mark I上工作,Mark I是在哈佛大学开发的计算机,是现代电子计算机的祖先之一。为了找出计算机的故障,他们经过几个小时的努力,终于有

27、人在一块计算机电路上找到并移去一只两英寸大小的蛾子。从那时起,任何时候计算机出错,Hopper少将和其他人就会说“有bug”。第一只bug还记录在 Hopper少将1945年的日志簿里,现收藏于海军水面武器中心。1991年,布什总统授予Hopper少将国家科技勋章。为了纪念和表彰Hopper少将的许多贡献,美国海军最近以她的名字命名一艘军舰。有关Hopper少将的更多信息,请登录网站bbb:/aaachips.navy.mil。1.3.7 编写易读的程序成为一个熟练的程序员远不只是写出能得到正确输出的程序那么简单,还包括形成良好的编程风格,即对你和其他人来说代码的可读性和可理解性如何。我们的目

28、标是形成满足下面这些原则的编程风格。l 可读性。程序应该容易阅读和理解。应该用注释来说明程序代码并形成文档。l 清晰性。程序应该用大家熟知的结构与标准的约定,而且应该避免在程序设计方面耍小聪明,避免编写模棱两可或是异常复杂的代码。l 灵活性。程序应该精心设计并编写,使其易于维护和修改。1.4 Java语言元素在这一节中,我们将通过描述一个小程序的细节来介绍Java语言的一些关键元素。我们将介绍程序是如何组织的,各部分有何用途。我们的目的是介绍重要的语言元素,后续小节将非常详细地讲解这其中的许多语言元素。我们将要学习的程序是Java版的经典HelloWorld程序。之所以称之为经典,是因为几乎每

29、个编程入门教材都是从它开始的。运行时,HelloWorld程序(图1.5)将在控制台屏幕上显示“Hello World”的欢迎词。/ * * File: HelloWorld.java * Author: Java Java Java * Description: Prints Hello World greeting. * / public class HelloWorld extends Object/ Class header / Start class body private String greeting = Hello World!; public void greet() /

30、Method definition / Start method body System.out.println(greeting); / Output statement / greet() / End method body public static void main(String args)/ Method header HelloWorld helloworld; / declare helloworld = new HelloWorld(); / create helloworld.greet(); / Method call / main() / HelloWorld clas

31、s / End class body图1.5 HelloWorld应用程序1.4.1 注释关于HelloWorld程序,第一个需要注意的是注释的使用。注释是用于建立程序文档的非执行部分,由于注释是非执行语句,编译器将会忽略它,使用它的唯一目的是使程序更易于阅读和理解。HelloWorld程序有两种形式的Java注释。在*与*之间的任何文本都被当作注释,在HelloWorld程序中,这种注释可以延伸至很多行,有时称作多行注释。第二种注释是双斜线(/)后的任何文本,因为它不能超过一行,所以称为单行注释。编译器遇到多行注释的开始/*时,它将忽略一切代码,直到找到对应的结束标志*/。这表明不能把一个多

32、行注释放在另一个多行注释内。也就是说,注释不可以嵌套。下面的代码段解释了使用/*和*/的规则。/* This first comment begins and ends on the same line. */* A second comment starts on this line . and goes on . and this is the last line of the second comment.*/* A third comment starts on this line . /* This is NOT a fourth comment. It is just part o

33、f the third comment. And this is the last line of the third comment.*/*/ This is an error because it is an unmatched end marker.从这个例子可以看出,在一个已经开始的注释里面,不可以再开始一个新的注释。这是因为在第一个注释里的文本,包括“/*”都会被编译器忽略。Java语言规则注释。多行注释以“/*”开始并以“*/”结束,可以延伸至很多行。编译器将会忽略它。注释双斜线(/)可用于把任意一行或该行的后面部分变成单行注释。多行注释常用于生成注释块来提供有用的程序文档。在He

34、lloWorld中,程序以一个注释块开始,用于给出程序名、整理名以及程序所做事情的简要说明。对于单行注释,双斜线(/)可以加在一行的任何地方,其后的部分将被编译器忽略。HelloWorld程序使用了很多单行注释来注释语言元素。Java编程提示:注释的使用。编写良好的程序在开始处应该有一个注释块,用于给出程序名、作者名以及程序所做事情的简要说明。1.4.2 程序布局另一个需要注意的事情是如何将程序整齐地排列在页面上。这是为了让程序易读、好懂而有意这样做的。在Java中,程序表达式和语句可以由程序员随意安排。它们可以每行一条、每行几条或一条占几行。正因为程序布局如此松散,所以养成良好的程序设计风格

35、以使程序易读,就显得非常重要。充分利用程序元素之间的空白有助于使程序更易读,也更具有吸引力。看一看HelloWorld中的语句是如何排列的。注意起始括号和结束括号是如何对齐的,如何使用单行注释符在结束括号后面加上注释。在Java程序中,使用大括号来标识不同的程序块,适当的缩进和单行注释会更容易判断大括号是如何配对的。类似地,可以使用缩进来表示程序的一个元素何时被包含在另一个元素中。这样,HelloWorld类的元素是在标识开始和结束的大括号内缩进的。在main()方法内的元素以缩进来表示它们是属于一个方法的,像这样使用缩进来分辨程序的结构会使程序更加易读、 好懂。Java编程提示:缩进的使用。

36、一个块内的代码应该缩进。块的开始与结束括号应该对齐。应该用一个注释来标识一块代码的结束。1.4.3 关键字和标识符如表1.1所示,Java有50个预定义的关键字,它们是语言中有特殊意义的单词并被保留用于特殊用途。例如,HelloWorld程序(图1.5)中所使用的关键字是:class,extends,private,public,static和void。表1.1 Java 关键字abstractcontinuefornewswitchassertdefaultgotopackagesynchronizedbooleandoifprivatethisbreakdoubleimplementspr

37、otectedthrow 续表byteelseimportpublicthrowscaseenuminstanceofreturntransientcatchextendintshorttrycharfinalinterfacestaticvoidclassfinallylongstrictfpvolatileconstfloatnativesuperwhile关键字的一个重要限制是它们不能作为方法、变量或类的名称。但是,在符合规则和约定的情况下,程序员可以为程序中的类、方法和变量命名。类、方法和变量的名称称为标识符,它们应该满足某些语法规则。Java语言规则标识符。标识符必须以字母(AZ,a

38、z)开头,后跟任意数目的字母、数字(09)或下划线(_),或美元符号($)。标识符不能和Java关键字相同。记住,Java是区分大小写的,所以两个不同的标识符可能包含顺序相同的相同字母(如thisVar与ThisVar),它们只是第一个字母的大小写不同。除了标识符的语法规则外,Java程序员为类、变量和方法命名时应该遵循一定的风格约定。类的名称应该以大写字母开头并且名称中的每个单词应以大写字母开始,例如HelloWorld和TextField。变量和方法的名称应以小写字母开始,但也可以大写字母开始来区分单词,例如main(),greeting,greet(),getQuestion()和get

39、Answer()。这个约定的优点是只要看看程序中的元素是如何写的,就能很容易地区分它是类、方法、还是变量(想要了解更多的Java风格约定,请看附录A)。Java程序员应该遵循的另一个重要约定是可以使用描述性的标识符为类、变量和方法命名,使程序更易读。Java编程提示:标识符的选择。为了使程序更易读,最好使用能描述类、变量和方法用途的名称。1.4.4 数据类型和变量如果计算机程序不能操作不同类型的数据,例如数字和字符串,那么它的作用将大大受限。它能对数据进行什么样的操作取决于数据的类型,例如,可以对数字进行乘和除运算,但对字符串就不行。因此,Java程序中的数据是根据其数据类型来区分的。广泛地讲

40、,Java中有两种类型的数据:各种对象类型和8种自带的原子数据类型。除了程序员设计的新的对象类型外,Java还有许多种自带的对象类型。在这一章中,我们将遇到两种类型String和PrintStream。Java的原子类型包括3种整型类型、3种实型类型、1种字符类型和1种只有true和false值的布尔类型。原子类型的名称用关键词int表示整型,double表示实数型,boolean表示布尔类型。正如我们在第0章中所提到的,变量是一个有名称的存储位置,它用于存储一个特定类型的值。实际上,你可以把变量当作一个特殊的用于保存数据的容器,但只保存某种类型的数据(如图1.6)。例如,一个int型变量可以

41、保存如5或-100的数据。一个String型变量可以保存如“Hello”这样的数据(实际上,这并不全对,而是有更复杂的解释,我们将在第2章进行更多讨论)。图1.6 变量就像有类型的容器在HelloWorld类中,实例变量greeting(第8行)保存了一个String类型的值。在main()方法中,变量helloworld被赋值给HelloWorld对象(第16行)。文本值是程序中的某些类型的实际值。例如,双引号中的字符串(如“Hello World!”)是一个String文本。一个数字(例如45.2)是double类型的字面值,-72是int类型的字面值。我们的HelloWorld程序只用到

42、一个字符串字面值,即字符串“Hello World!”。1.4.5 语句Java程序是语句的集合,语句是在程序中执行某种动作的代码段。当程序运行时,我们说它是在执行语句,意思是它在执行语句中的动作。在我们的HelloWorld程序中,第8,11,15,16和17行有各种类型的语句。注意,这些行都是以分号结束的,Java的规则是每条语句必须以分号结束,省略分号会造成语法错误。声明语句用于声明一个特定类型的变量。在Java中,变量在使用前必须先被声明,不声明会产生语法错误。在最简单的情况下,一个声明语句通常以变量类型开始,接着是变量的名称,最后以分号结束。如下所示:类型 变量名;变量类型可以是我们

43、提到的原子类型中的任意一种,例如int,double或boolean,或者对于一个对象来说,它是对象的类的名称,例如String或HelloWorld。尽管Java约定变量的名称以小写字母开头,但如前所述,它可以是任何合法的标识符。在HelloWorld程序中,第15行有一个简单的声明语句:HelloWorld helloworld;这个例子为一个对象声明了一个变量。变量名称是helloworld, 它的类型是HelloWorld, 它是我们例子中所定义的类的名称。又例如,下面的语句声明了两个int变量,分别取名为int1和int2:int int1;int int2;正如我们所提到的,int

44、是Java的一个原子类型,单词int是Java的关键字。这里不进行更多的细节描述,声明一个变量可以使程序留出足够的内存空间来保存这种类型的数据。因此,在这个例子中,Java将会保留足够的空间来保存一个int类型的数据。赋值语句是把一个值保存(或赋值)到一个变量中的语句。赋值语句使用等号(=)作为赋值操作符。其最简单的形式是,等号的左边是一个变量,右边是某种类型的值。如同别的语句,赋值语句以分号结束:变量名=数值;执行赋值语句时,Java将首先确定右边是何种类型的数值,然后把它赋值(保存)给左边的变量。这里有几个简单的例子:greeting = Hello World;num1 = 50; /

45、(a) Assign 50 to num1num2 = 10 + 15; / (b) Assign 25 to num2num1 = num2;/ (c) Copy num2s value (25) into num1第一个例子里,右边的值是字符串文本“Hello World”,它被保存于greeting中。当然,greeting必须是与右边相同的String 型变量。下一个例子中,右边的值是50。假设num1是int型的变量,它用于保存这个值。这个赋值过程如图1.7(a)所示。第3个例子中,右边的值是25,它是由10加上15所得到的。于是赋给num2的值是25。这个赋值过程如图1.7(b)所示。当然,这里假设num2是一个int变量。最后一个例子中,右边的值是25,它是我们刚刚保存在变量num2中的值,于是25被保存于num1中,如图1.7(c

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

当前位置:首页 > 社会民生


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