像计算机科学家一样思考Java

978-7-115-31322-5
作者: 【美】Allen B. Downey
译者: 滕云周哲武
编辑: 陈冀康
分类: Java

图书目录:

详情

本书按照培养读者像计算机科学家一样的思维方式的思路来教授Java语言程序设计。本书是作者在美国Olin College大学教学的过程中,专门为学生编写的计算机程序设计课程(Java)的教材。全书包含16章和4个附录。详细介绍了Java语言编程方方面面的知识。每章带有术语介绍和练习题,方便读者巩固该章所学的知识和技巧。

图书摘要

像计算机科学家一样思考Java

[美] Allen B. Downey  著

滕云 周哲武 译

人民邮电出版社

北京

本书作者基于自己在美国各所大学和学院讲授计算机科学导论课程的经验,开创了“像计算机科学家一样思考(How to Think Like a Computer Scientist)”的教学理念和方法。本书正是基于这样的方法,用全新的角度、丰富的实例全面地讲解了Java语言。

全书共15章。第1章介绍了编程的基本知识,即什么是编程以及如何编程。第2章到第4章分别介绍了变量和类型、无返回值方法、条件语句和递归等基础知识;第6章到第9章分别介绍了带返回值的方法、迭代、循环、字符串和可变对象;第 11 章到第 15 章则分别介绍了对象、数组、面向对象编程等相对高级的话题。全书贯穿了一个GridWorld的程序示例,分三个部分逐步扩展,分别在第 5 章、第 10 章和第 16 章介绍,用以巩固前面相应各章所介绍的知识和概念。附录 A 介绍了 Java图形编程,附录 B介绍了 Java中的输入输出,附录C和D分别从程序开发和调试的角度给出了有用的建议。

本书适合 Java的初学者和初级程序员阅读,也可以作为相关专业或培训的教程使用。通过学习本书,读者不仅可以在 Java方面达到初窥门径的效果,同时对于如何掌握和应用计算机编程这门技艺也会有一个全面而科学的认识。

Allen B. Downey是美国Olin工程学院的计算机科学副教授。他曾经在Wellesley College、Colby College和U.C. Berkeley教授计算机科学课程。他在MIT获得学士和硕士学位,并且从U.C. Berkeley获得计算机科学博士学位。Allen基于自己教授计算机程序设计课程的经验,开创了“像计算机科学家一样思考(How to Think Like a Computer Scientist)”的教学理念和方法,并由此编写了几本程序设计语言的图书。其中,《Think Python》、《Think Complexity》由O’Reilly出版;《Think Java》、《Think C++》也广受关注和好评。

滕云,ThoughtWorks软件工程师,目前主要从事企业级软件开发,擅长技术包括C/C++、Java、Ruby、Linux和测试自动化等。爱听古典音乐,尤其是贝多芬;爱写诗词,尤其是长短句;爱吃川菜,尤其是回锅肉。个人博客:http://www.davenkin.me。腾讯微博:@无知者云

周哲武,码农,躬耕于 ThoughtWorks,不求闻达于诸侯,但求程序之乐。性喜静、好宅、好酒,更好书。尝以为不写代码即解决客户问题为善之善者,干净优雅代码解决问题次之。近年专注于企业级应用开发,擅长各种自动化测试策略,以及遗留系统代码重构。新浪微博:@牧野飞霜

我们从别人的发明中享受了很大益处,我们也应该乐于以我们的任何一种发明为别人服务,并且这种事我们应该自愿地和慷慨地去做。

——本杰明·富兰克林,引用自Edmund S. Morgan所著的《本杰明·富兰克林传》

我为什么写这本书

1999 年,当我还在科尔比学院教书的时候,我便开始写这本书了。现在,这已经是第5个版本了。那时,我正使用Java程序设计语言来教授计算机科学导论课程,但始终没有找到一本合适的教材。一方面,这些书的内容太多,让学生去阅读一本800页的技术书籍显然不可能,即便是我硬叫他们去读也不可能,更何况我并不想他们这么做。另外,书中多数内容的针对性都很强,比如 Java 语言的细节和 Java类库等内容,而这些类库在学期结束时很有可能就已经过时了。这样的书籍显然不是我需要的。

另一方面,我发现一开始就讲面向对象编程并不合适。很多在其他方面表现得很好的学生,一旦接触到对象就一头雾水了。于是我开始写这本书,每天写一章,一共写了13天,第14天编辑,然后是复印和装订。上课第一天我便把书分发给学生们,并叫他们每周阅读一章,这样一来,他们阅读的速度比我书写的速度慢了7倍。

背后的哲学

以下是我写这本书的一些想法:

• 词汇很重要。学生应该有能力去讨论程序并且能够听懂我所讲的话。我尝试着引入尽可能少的术语,并在第一次使用这些术语时精心地给出定义,然后在每章的最后附上术语表。在我的课程中,我会在小测验和考试中包含一些和词汇相关的题目,然后要求学生使用恰当的术语进行回答。

• 要编写程序。学生应该理解算法,知晓程序设计语言本身,并能够调试程序。太多的书籍都将程序调试内容给忽略掉了。本书最后的附录D讲述程序调试的内容,附录C讨论程序开发内容(可以帮你避免调试)。我建议学生们尽早地阅读这些内容,并且时常回过头来复习。

• 有些概念需要时间来消化。对于一些较难的内容,本书将反复讲到,这样可以给学生更多的机会去复习和巩固。如果第一次没有学会,可以在后面赶上。

• 我试图尽量少地使用 Java 语言来教会学生获得尽量多的编程能力。本书的目的在于教学生如何编写程序和一些计算机科学导论方面的概念,而不是 Java语言。因此,我去除了一些Java语言特性方面的内容,比如switch语句便没有必要了,多数类库也不在本书的教授范围之内,特别是一直在变并很可能被替换掉的AWT。

这种最小化的方式有它的优点。除了章后练习,每章大概10页左右。在我的课程中,我要求学生提前阅读要讲的章节,他们都愿意这么做并且理解得很好。这样一来,我们便有时间来讨论一些更抽象的内容、做一些课内练习和学习本书之外的内容。

但是,这种最小化方式也有缺点。从本质上讲,这种方式没有多少有趣的地方。书中的多数例子只是在展现基本的语言特性,并且很多练习都包含了字符串操作和数学相关的知识。我认为其中的一些内容是有趣的,但是还有很多能够激发学生兴趣的内容,比如图形、声音和网络应用只是一带而过。

问题在于,很多令人兴奋的内容都包含大量的细节,而其中的概念并不多。从教学上讲,这样浪费了太多的努力但又达不到教学目的。因此,在取悦学生和富含知识之间便出现了一个折中。我让老师们自己去解决这种平衡。作为帮助,本书的附录中包含图形、键盘输入和文件输入等内容。

面向对象编程

有些书一上来便介绍对象,另一些书先通过面向过程的编程方式进行引导,再逐渐讲授面向对象编程方式。本书采用后一种方式。

Java中许多面向对象特性都是由先前语言出现的问题来驱动的,并且它的实现也受到了这些语言发展历史的影响。在学生不了解他们需要解决的问题的情况下,有些特性是很难解释的。推迟讲面向对象编程并不是我的意图所在,相反,我会尽快地涉及到这些内容,只是我每次只讲一个概念,并且尽可能清晰,以使学生可以相对独立地练习每一个知识点,然后再加入后续的概念。但是我也承认,达到这样的目的确实需要时间。

计算机科学预科考试

当科尔比学院宣布预科考试将转向Java,我顺其自然地将本书更换成Java版本。当看到预科的考试大纲时,我发现大纲中的内容完全就是我书中所选内容的一个子集。

2003年1月,我正在写本书的第4个版本,该版有如下变化:

• 增加了一些章节以覆盖更多的预科大纲。

• 改进了关于调试和程序开发内容的附录。

• 将我在上课时用到的练习、小测验和考试的题目放在了相关章节的末尾。同时,针对预科考试增加了一些题目。

最终,在2011年的8月,我开始了本书第五版的写作,增加了预科考试中包含的GridWorld案例研究。

免费!

从一开始,本书便允许读者进行复制、分发和修改。读者可以下载到本书不同格式,并且既可以在计算机上阅读,也可以进行打印。老师可以免费地进行多份复印。任何人均可以按照自己需求对本书进行定制性的修改。

有人将本书翻译成其他的计算机语言(包括Python 和Eiffel),也有翻译成其他的自然语言(包括西班牙语、法语和德语)。这些翻译版本中的许多也是免费的。

受开源软件的驱动,我也采用了“早发布,勤更新”的方式。我尽量减少错误,但同时我也需要读者的帮助。

本书的反响是很好的。我几乎每天都收到读者的反馈信息,他们甚至不嫌麻烦将“bug报告”发送给我。通常,我都会在几分钟内更改书中的错误,然后发布更新。我将本书看做是一份正在进行中的工作,一旦有时间或者有读者发回反馈,我都将一点一点地进行改进。

关于书名

本书的书名给了我不少的痛苦。不是所有人都知道,本书的题目在很大程度上只是个玩笑。阅读本书很可能不会让你像一个计算机科学家那样思考,那需要时间、经验,并且很可能还需要更多的课程。

但本书的书名的真实含义在于:它不是关于 Java 的,并且不是完全关于编程的。如果成功的话,那么本书是关于思考方式的。计算机科学家自有一套解决问题的方法,而且这种方法是独特的、通用的和强大的。我希望本书能引领你去感知这样的方法,继而在某种程度上,你会发现自己确实是在像计算机科学家一样思考。

贡献者名单

当我开始写免费图书时,我并没有留意贡献者名单。当 Jeff Elkner建议我之后,我才发现省略掉这份名单是多么的尴尬。这份贡献者名单是从第四版开始的,故许多对先前版本提出建议和改正的贡献者都被省略掉了。如果你有另外的建议,请发送邮件到:feedback@greenteapress.com。

• Ellen Hildreth将本书用在威尔斯利学院的数据结构课程中,并对本书做了一系列的更正,另外还提出了一些很好的建议。

• Tania Passfield曾指出,在第 4章的术语表中,有些术语在该章内容中已经不存在了。

•Elizabeth Wiethoff发现了我对于的解释是错误的,她目前正在写本书的Ruby版本。

• Matt Crawford发给我了一份满是更正的补丁文件。

• Chi-Yu Li指出了一个排版错误和一个代码例子错误。

• Doan Thanh Nam更正了第 3章中的一个例子。

• Stijn Debrouwere发现了一个数学排版错误。

• Muhammad Saied将本书翻译成了阿拉伯文,并发现了多处错误。

• Marius Margowski发现了一个代码例子中的一处不一致。

• Guy Driesen发现了多个排版错误。

最后,我想感谢Chris Mayfield对本书最新版的巨大贡献。他仔细审阅了本书并对书中一百多次错误做了更正。最新版中加入了一些新的变化,比如嵌入式超文本链接,交叉引用,练习题版式的一致性,代码例子中Java语法高亮等。

本书的目的在于教你怎样像一个计算机科学家那样思考。我喜欢计算机科学家思考问题的方式,因为他们能将数学、工程学和自然科学中的最好的特性组合在一起。计算机科学家像数学家一样使用规范的语言来表达思想(特别是计算);像工程师一样进行设计并将不同的组件装配成系统,然后在不同的实现方案中进行权衡;又像科学家一样观察复杂的系统,形成假设,再测试预言。

计算机科学家最重要的技能在于问题解决(problem-solving)技能。他们能够对问题进行简明陈述,创造性地给出解决方案,并且将解决方案清楚准确地表达出来。学习编程的过程便是练习解决问题能力的好机会,这也是本章的标题叫做“程序之道”的原因所在。

一方面,你将从本书中学习编写程序,这本身便是一项技能。另一方面,你会将编程当做一种为了实现一定目的的工具,当我们一路走下去,这样的目的也将变得清晰起来。

你即将学习的语言是Java,这是一种相对较新的语言(Sun公司于1995年5月发布了 Java的第一个版本)。Java是一种高级语言(high-level language),你可能听过的其他高级语言还有Python、C、C++和Perl。

有了“高级语言”,还有低级语言(low-level language),有时候也叫做机器语言或者汇编语言。粗略地说,计算机只能够执行由低级语言编写的程序。因此,由高级语言编写的程序必须先被翻译成低级语言才能够运行。这样的翻译过程是需要时间的,这也是高级语言的一个小缺点。

但是,高级语言的优点却太多了。首先,使用高级语言进行编程容易得多。花的时间更少,代码更短,更容易阅读和修改。其次,高级语言具有可移植性(portable),这意味着高级语言可以在几乎不修改的情况下运行于多种计算机平台。相比之下,低级语言只能在一种计算机上运行,如果要在另一种计算机上运行,则需要重新编码。

鉴于高级语言的这些优点,几乎所有的程序都是用高级语言编写的。低级语言只适用于少量特殊的情况。

对由高级语言编写的程序进行翻译有两种方式:解释( interpreting )和编译(compiling)。完成解释任务的程序叫做解释器,它读入由高级语言编写的程序,并且按照高级语言的指令执行程序。实际上,解释器按行对程序进行翻译,然后执行命令。

完成编译任务的程序叫做编译器,它在运行任何一条指令之前先读入由高级语言编写的程序并一次性对该程序进行编译。通常,编译过程是一个单独的步骤,程序的运行则在编译过程之后。在这种情况下,高级语言称为源代码(source code),经编译器生成的程序称为目标代码(object code)或者可执行程序(executable)。

Java 语言编写的程序既可以被编译,也能够被解释。和其他语言不同的是,Java的编译过程并不生成机器语言,而是生成字节码(byte code)。字节码和机器语言一样,可以被容易(和快速)地解释,而它又像高级语言一样具有可移植性。因此,在一台机器上编译 Java,在另一台机器上解释运行是可能的。这也是 Java 相比其他高级语言的一个优势,如图1-1所示。

图1-1 Java程序的编译和解释

虽然图1-1所示的这个过程看来很复杂,但在大多数程序开发环境下这个过程已经被自动化了。通常你只需要编写源代码,然后点击一个按钮或者键入一个命令便可以完成程序的编译和运行。而另一方面,知道背后在发生些什么事对程序开发者是有价值的,这样就可以方便地找到整个过程中出错的地方。

程序是说明如何执行计算的一个指令序列1。计算可能是数学计算,比如求解方程组或者寻找多项式的根等;但计算也可以是符号型计算,比如查找和替换文档中的文本或者编译一个程序(够奇怪的)。

注释:1此定义并不适用于所有编程语言,其他关于程序的定义,参见http://en.wikipedia.org/wiki/Declarative-programming。

指令也称作语句(statement),它的格式因不同的编程语言而有所不同。但多数语言都包括一些基本的操作。

输入:从键盘、文件或其他设备获取数据。

输出:在屏幕上显示数据,或者向一个文件或其他设备写入数据。

数学:完成基本的数学运算,比如加法和乘法。

测试:检测特定条件并运行适当的语句序列。

重复:重复性地执行某个动作,通常包括一些可变量。

这差不多就是计算机程序了。我们曾使用的每个程序,不管多么复杂,都是由执行这些基本操作的语句组成的。因此,描述程序设计的一种方法便是将大的复杂任务分解成小的子任务,直到这些子任务足够简单,可以被这些基本操作中的一种操作完成为止。

程序中隐藏的未被发现的错误叫做漏洞(bug),跟踪和修改 bug 的过程叫做调试(debugging)。程序中存在三种类型的错误,将它们区分开来有助于更快地定位跟踪错误。

编译器只能在程序语法正确的情况下才能完成编译任务,否则,编译将失败,程序自然也就不能运行。语法(syntax)是程序的结构和关于该结构的一些规则。

比如,在英语中,一个句子必须以大写的首字母开始,以句点结束。

对于多数读者,少量的语法错误并不是什么大的问题,但编译器就没有这么宽容了。哪怕是很小的语法错误,编译器都会报错并且退出编译过程,你也别想运行程序了。

更糟糕的是,Java中的语法规则比英语还多,而编译器给出的错误信息也不那么有用。在你编程生涯的前几个星期里,你可能会把大量的时间花在语法错误上。随着经验的增加,你的语法错误将会减少,查找错误也会变得更快。

第二种错误类型是运行时错误。之所以叫“运行时错误”,是因为这些错误直到程序运行时才会出现。在 Java 中,解释器在执行字节码的过程中发生的错误称为运行时错误。

Java是一种趋向于安全的语言,这意味编译器会捕获大量的错误。因此运行时错误并不多见,特别是简单程序。

在Java中,运行时错误称为异常(exception)。在多数情况下,当异常发生时,通常会有窗口或对话框弹出以显示此时程序正在进行的操作。这些信息对于调试来说是很有用的。

第三种错误称为逻辑错误(logicerror)或语义错误(semanticerror)。当程序中存在这样的错误时,编译过程虽然能够完成,也不会生成错误信息,但程序却不能完成正确的工作。具体来说,程序是按照你所写的去执行的,但问题在于你所写的程序并没有表达出你真实的意图。也可以说,此时的程序从语义上讲是错误的。对这种逻辑错误的识别是比较困难的,因为我们必须向后看,根据程序的输出来查找错误。

在本课程中,调试是你将要学习掌握的最重要的技能之一。虽然调试有时是件令人沮丧的事情,但同时也是程序开发中最有趣、最有挑战性和最有价值的活动之一。

调试就像侦探工作一样,你根据一堆线索来推断导致结果的原因。

调试同时也像一门实验性科学。一旦你意识到有什么地方出了错误,你便会修改程序再重新运行。如果你的假设成立,那么你就可以对修改后的结果进行预测,进而离成功更近一步。否则,你不得不做出新的假设。就像Sherlock Holmes所说:“当你排除了所有的不可能后所剩下的,不管有多么的不确定,都是事实。”(出自阿瑟·柯南·道尔《四个签名》)

对于有些人来说,编程和调试是一回事情,即编程是逐步调试直到满足要求的过程。在一开始,程序应该就能运行,然后不断地进行修改,这样,在整个开发过程中,你的程序都是可以运行的。

比如,Linux操作系统包含成千上万行代码,然而它起初只是Linus Torvalds为了研究 Intel 80386 芯片而开发的一个小程序。Linus 一开始只是想实现将输出的“AAAA”字符串变为“BBBB”,后来,就这么一个小程序演化成了Linux操作系统。

在后续章节中,我将针对调试和其他编程实践提出更多的建议。

自然语言(Natural languages)指人类所说的语言,比如英语、西班牙语、法语等。自然语言并不是由人类设计的,它们是自然演化而形成的。

形式语言(Formal languages)是人类为了某种应用上的需要而设计的。比如,数学中的各种记号便是一种形式语言,这种语言能够很好地描述数字和符号之间的关系。化学家也用形式语言来表示化学分子的结构,而更重要的是:

编程语言是一种用来表达计算的形式语言。

形式语言对于语法有严格的规则。比如,“3+3=6”是一个合法的数学表达式,但“3$=”则不是。同样,H2O是一个正确的化学名,而 2Zz则不是。

语法规则有两种:记号规则和结构规则。记号是语言的基本元素,比如单词、数字和化学元素。表达式“3$ =”的问题在于,“$”在数学上不是一个合法的记号(至少据我所知是这样的)。类似地,“2Zz”也不合法,因为没有化学元素的简称为“Zz”。

第二种语法规则表现在表达式的结构上,即怎么编排程序中的记号。表达式“3$ =”在结构上是不合法的,因为等号不能出现在方程的结尾。类似地,在分子表达式中,下标只能出现在元素之后,而不是之前。

当我们在读英语句子或形式语言中的表达式时,我们需要搞清楚这些语句的结构(虽然对于自然语言来说,你是在潜意识里完成这个任务的),这个过程称为解析(parsing)。

虽然形式语言和自然语言有许多相同的特征,比如记号、结构、语法和语义等,但它们也存在不同。

多义性(ambiguity):自然语言充满了多义性,人类可以根据所处环境和其他信息来处理这样的多义性。而形式语言是非歧义的,这意味着不管在什么环境下,一条语句只能表达一种含义。

冗余性(redundancy):为了弥补多义性,同时也为了减少误解,自然语言通常是冗余的,而形式语言则更简洁。

无修饰性(literalness):自然语言中有许多惯用语和隐喻,而形式语言则非常准确。

我们从小就在说自然语言,当转向形式语言时,通常会有一段困难的时间去调整和适应。自然语言和形式语言之间差别在某种程度上就像诗歌和白话文之间的差别一样:

诗歌:词语的发音和意思都是重要的,一首诗作为一个整体营造出一种氛围或情感效果,其中的多义性是常见的,甚至是故意而为的。

白话文:字面上的意思更重要,而结构也承载了更多的语言含义。

程序:计算机程序是非歧义的。我们通过对程序中记号和结构的分析是完全可以理解计算机程序的。

这里有些关于阅读程序(和其他形式语言)的建议。首先,形式语言比自然语言的信息密度更大,由此阅读所花的时间也越长。其次,程序中的结构是很重要的,这样一来,从头到尾、从左向右阅读程序往往不是一个好主意。相反,应该试着在自己的大脑里解析程序,识别记号并且翻译程序中的结构。最后,细节是重要的,像拼写错误和标点错误这样的小错误,虽然在自然语言中不是什么大问题,但是在形式语言中却有很大的影响。

按照传统,我们在学习一门新语言时,所写的第一个程序都是“Hello,world.”程序,该程序的功能是在屏幕上显示“Hello,world.”字符串。Java的“Hello,world.”程序是这样的:

class Hello {

  // main函数,打印简单输出

  public static void main(String[] args) {

   System.out.println("Hello, world.");

 }

}

对于初学者来说,这段程序可能有些难于解释的特征,但它预先给我们展示了一些主题,我们将在之后的内容中涉及到这些主题的细节。

Java程序由类定义(class definition)组成,类的定义具有以下形式:

class CLASSNAME {

  public static void main (String[] args) {

  STATEMENTS

 }

}

这里,CLASSNAME表示程序员自己选择的类名,上例中的类名为Hello。

main 是一个方法(method)。方法表示一个有名字的语句集合。main 函数是特殊的,它是程序执行的入口。当程序运行时,首先执行main函数中的第一条语句,当执行完main函数中最后一条语句时,程序退出。

main 函数可以包含任意多条语句,而上例中只含有一条,这是一条打印输出语句(print statement),功能是在屏幕上显示一条信息。让人疑惑的是,“print”就其本身的意思来说,即可表示“在屏幕上显示信息”,也可表示“向打印机传送数据”。在本书中,我们所说的所有“print”都表示“在屏幕上显示信息”。print 语句以分号(;)结束。

System.out.println是Java类库提供的方法。类库(library)是类定义和方法定义的集合。

Java使用花括号({和})对程序进行分组。在上个例子中,最外层的花括号(第1行和第8行)包含了类的定义,里面的花括号包含了main函数的定义。

第3行以//开始,表明此行是注释(comment)。注释为解释程序功能的文本,编译器将忽略从//到行尾的所有内容。

问题解决(problem-solving):对问题进行建模,寻求解决方案并表达解决方案的过程。

高级语言(high-level language):便于人类阅读和编写的编程语言,比如 Java。

低级语言(low-level language):便于计算机运行的编程语言。也叫做机器语言或汇编语言。

形式语言(formal language):人类为了特殊用途(比如表达数学理论或计算机程序)而设计的语言。所有的编程语言都是形式语言。

自然语言(natural language):人类所说的所有语言都是自然语言。自然语言经过自然演化而形成。

可移植性(portability):程序能够在多种计算机上运行的能力。

解释(interpret):按行翻译由高级语言编写的程序并执行的过程。

编译(compile):读入由高级语言编写的程序,一次性将高级语言翻译成低级语言,为之后执行做准备。

源代码(source code):由高级语言编写的,并且未经编译的程序。

目标代码(object code):编译器通过编译源代码所生成的输出。

可执行程序(executable):能够运行的目标代码的另一个名称。

字节码(byte code):由编译 Java程序所生成的一种特殊目标代码。字节码与低级语言很相似,但又像高级语言一样是可移植的。

语句(statement):表示一个计算过程的程序的一部分。

打印语句(print statement):用于在屏幕上输出一条语句。

注释(comment):源代码的一部分,包含一些说明性信息,但对程序的运行不产生任何作用。

方法(method):多条语句的一个命名集合。

库(library):类定义和方法定义的一个集合。

漏洞(bug):程序中隐藏的一个错误。

语法(syntax):程序的结构。

语义(semantic):程序所表达的意思。

解析(parse):检查程序并分析语法结构。

语法错误(syntax error):程序中导致解析失败进而编译失败的一个错误。

异常(exception):导致程序运行时失败的错误。也叫运行时错误。

逻辑错误(logic error):导致程序不能按照开发者的预期运行的错误。

调试(debugging):查找并排除以上3种错误的过程。

练习 1.1 计算机科学家有一个烦人的习惯,他们会用一些常用的英语单词来表示其他的意思。比如,在英语中,statement 和 comment 的意思是相同的,但是在程序中就不同了。

在本书中,每个章节的最后都附有术语表,列出这些单词和短语的目的是强调它们在计算机科学中的特殊含义。虽然你可能很熟悉某些单词,但它们的意思却有可能和你先前所知道的完全不一样。

1.在计算机行业中,语句(statement)和注释(comment)的区别是什么?

2.说一个程序是可移植的是什么意思?

3.什么是可执行程序?

练习 1.2 在你做其他事情之前,先配置好环境,使 Java程序能够成功地编译和运行。一些环境提供了与1.5节中示例相类似的样例程序。

1.编写本章中的“Hello,world”程序,编译并运行。

2.在输出“Hello,world!”之后,再添加一行打印语句,比如打印“How are you?”,然后重新编译运行。

3.在程序的任何地方加入一条注释,再编译运行,新加的注释对程序的运行不应该有任何影响。

本练习虽然有些琐碎,却是我们开发其他程序的一个出发点。调试的自信来自于你对自己编程环境的自信。在某些环境下,我们很容易搞不清楚哪个程序正在运行,有时甚至于发生调试的程序和实际运行的程序不一样的情况。打印语句可以方便告诉我们当前运行的是哪个程序。

练习 1.3 在程序中制造尽可能多的错误是一个不错的主意,这样你便可以看到编译器给出的错误信息。有时编译器给出的错误信息很精确,这样你便可以很容易地做出修改。而有时,错误信息是具有误导性的,所以你应该能识别出何时依赖编译器,何时依赖自己。

1.去掉程序中的一个开花括号。

2.去掉程序中的一个闭花括号。

3.将main改为mian。

4.去掉static。

5.去掉public。

6.去掉System。

7.将println改为Println。

8.将pringln改为print。这是很难处理的,因为这是一个逻辑错误,而不是语法错误。System.out.print语句也是合法的,只是它所做的并不是你所期待的。

9.去掉程序中的一个圆括号。然后再多加一个。

相关图书

Effective Java中文版(原书第3版)
Effective Java中文版(原书第3版)
Java核心技术速学版(第3版)
Java核心技术速学版(第3版)
Java编程动手学
Java编程动手学
Java研发自测入门与进阶
Java研发自测入门与进阶
Java开发坑点解析:从根因分析到最佳实践
Java开发坑点解析:从根因分析到最佳实践
Java EE企业级应用开发实战(Spring Boot+Vue+Element)
Java EE企业级应用开发实战(Spring Boot+Vue+Element)

相关文章

相关课程