第2章 编写第一个程序
本章介绍如下内容:
在文本编辑器中输入一个程序;
使用class语句对Java程序进行命名;
使用括号组织程序;
将信息存储到变量中;
显示存储在变量中的信息;
保存、编译和运行程序;
修复错误。
第 1 章已经提到,计算机程序是一组告诉计算机做什么的指令。这些指令使用编程语言输入到计算机中。
在本章,读者将通过将指令输入到文本编辑器的方式来创建第一个Java程序。输入完毕之后,可以保存、编译并测试该程序。
2.1 编写程序所需的工具
第1章讲到,要创建Java程序,你必须有支持Java Development Kit(JDK)的开发工具,比如NetBeans集成开发环境(IDE)。你还需要可以编译和运行Java程序的工具,以及用来编写Java程序的文本编辑器。
对于大多数编程语言来说,计算机程序都是通过在文本编辑器(也称为源代码编辑器)中输入文本的方式来编写的。有些编程语言自带了文本编辑器。Oracle的开发工具NetBeans就包含了用来编写Java程序的编辑器。
Java程序是简单的文本文件,没有诸如文本居中、粗体等其他特别格式。NetBeans源代码编辑器很像一个功能增强了的简单文本编辑器。彩色文本用来识别用户输入的不同元素。NetBeans本身也带有适当的缩进格式,以及有用的编程文档。
由于 Java程序是文本文件,因此可以使用任何文本编辑器打开Java程序,并对其进行编辑。你也可以使用NetBeans编写Java程序,然后在Windows Notepad(记事本)中打开它,并做出相应的修改,然后再在NetBeans中打开该程序,这不会造成任何问题。
2.2 创建 Saluton 程序
读者将创建的第一个 Java 程序显示计算机科学界的传统问候语“Saluton mondo!”。
在NetBeans中输入第一个程序之前,先采取如下步骤来创建一个称为Java24的新项目。
1.选择菜单命令 File->New Project。
2.选择项目分类“Java”和项目类型“Java Application”,然后单击 Next 按钮。
3.输入“Java24”作为该项目的名称。如果之前已经创建了该项目,则会看到错误信息“Project folder already exists and is not empty”。
4.取消选中“Create Main Class”复选框。
5.单击Finish按钮。
Java24项目在其文件夹中建立起来。在阅读本书的过程中,你可以为编写的所有Java程序使用这个项目。
2.3 开始输入程序
NetBeans将所有相关的程序分组列入到一个项目中。如果你还没有打开Java24项目,可采用如下方式打开。
选择菜单命令 File->Open Project。
找到并选择NetBeansProjects文件夹(如果有必要)。
选择 Java24,并单击 Open Project 按钮。
Java24项目出现在项目(Projects)面板中。
为了添加一个新的Java程序到当前的项目中,选择File->New File,打开New File Wizard对话框,如图2.1所示。
分类(Categories)面板会列出用户可以创建的所有 Java 程序的类型。在该面板中单击“Java”文件夹来查看属于该分类的文件类型。对本项目而言,选择“Empty Java File”类型,然后单击Next按钮。
在 Class Name 字段,输入“Saluton”,然后单击 Finish 按钮来创建新的 Java 程序。名为Saluton.java的空文件将在源代码编辑器中打开。
在源代码编辑器中,通过输入程序清单2.1中的每一行语句,由此开启你的Java编程生涯。这些语句称为程序的源代码。
图2.1 New File Wizard对话框
警告:
不要输入每行前面的行号和冒号,它们在本书中的目的是方便引用代码。
程序清单2.1 Saluton程序
确保大小写与该程序清单中一致,并使用空格键或Tab键在第2~第4行前面插入空白。当输入完后,选择 File->Save,然后单击 Save All Files 按钮来保存文件。
当前,Saluton.java 只包含 Java 程序的架构。读者可以创建多个开头与此相同的程序,当然,第1行的单词Saluton除外。该单词表示程序的名称,而且每个程序都不同。第3行是一个英语句子。其他内容对你来说是全新的。
程序的第1行如下:
把这句话翻译成自然语言的意思是:计算机,请将我的Java程序命名为Saluton。
第1章讲到,输入到计算机的每条指令都被称为语句。class语句让你能够给计算机程序指定名称,它还可以确定程序的其他方面,这将在后面介绍。术语 class 的重要性在于 Java程序也叫class(类)。
在这个例子中,程序名Saluton与文档名Saluton.java匹配。Java程序的名称应与其文件名的第1部分相同,而且大小写完全一致。
如果程序名与文件名不匹配,编译有些Java程序时可能会出错,而是否出错则取决于如何使用class语句来配置程序。
该程序的下一行如下:
这行语句告诉计算机:程序的主要部分从这里开始。Java程序被组织成多个部分,所以需要有种方法指出首先处理哪部分。
大多数Java程序的入口都是main语句,但applets和servlets例外,其中,前者是作为网页的一部分而运行的程序,后者是由Web服务器运行的程序。接下来的几章中,你编写的大多数程序都将main作为起点。
在Saluton程序中,除第3行之外,每行都包含一个大括号,要么是“{”,要么是“}”。这些大括号用于将程序中的语句分组(与小括号类似,小括号是用来将句子中的单词分组)。在左大括号“{”和右大括号“}”之间的内容属于同一组。
这些语句组称为块。在程序清单2.1中,第1行的左大括号“{”与第5行的右大括号“}”对应,它们将整个程序作为一个块。可以用这种方式来指示程序的开始和结尾。
块可以包含其他块(就像小括号可以这样使用“((……))”一样)。在Saluton程序中,第2行和第4行大括号指定了另一个块,这个块以main语句打头。程序运行时,计算机将把main语句块中的内容作为命令进行处理。
下面的语句是该语句块中唯一的内容:
该行这是占位行,行首的//告诉计算机忽略本行,在程序中放置它的目的在于方便人们阅读程序的源代码。用于该目的的行被称为注释。
注意:
NetBeans 可以显示块的开始位置和结束位置。在 Saluton 程序的源代码中单击其中一个大括号,这个大括号以及与之对应的大括号将显示为黄色。封装在这些黄色大括号中的Java语句组成了一个块。
至此,你已经编写完了一个完整的 Java 程序。你可以编译它,但是运行它时什么也不会发生。因为你没有告诉计算机要做什么。main语句块只包含了一行注释,而它将被忽略。要让 Saluton 程序问候用户,必须在main语句块的左大括号和右大括号之间添加一些命令。
2.4 在变量中存储信息
在编写的程序中,你需要将信息临时存储在某个地方,为此可以使用变量。变量是可存储整数、浮点数、真假值、字符及文本行等信息的地方。在变量中存储的信息可以修改,“变量”因此而得名。
在Saluton.java文件中,用如下语句来替换第3行:
这条语句告诉计算机:将文本行“Saluton mondo!”存储到变量 greeting 中。
在Java程序中,必须告诉计算机变量存储的信息类型。在这个程序中,greeting变量是一个字符串——可以包含字母、数字、标点符号及其他字符的文本行。在该变量前面添加String之后。就可以用来存储字符串值。
在程序中输入这条语句时,必须在行尾输入分号(;),在Java程序中,每条语句都要以分号结束。这就像句尾的句点,计算机使用它们来判断当前语句的结束位置以及下一条语句的开始位置。
对我们人类来说,每一行只输入一个语句的方式,可以使程序更具有可理解性。
显示变量的值
如果此时运行程序,将不会显示任何内容。在 greeting 变量中存储文本行的命令在幕后运行。要让计算机显示它在做什么,则需要显示该变量的内容。
在 Saluton 程序中,在语句 String greeting = "Saluton mondo!";的后面插入一个空行,然后输入下面的语句:
这条语句告诉计算机显示存储在greeting变量中的值。语句System.out.println告诉计算机在系统输出设备上(也就是你的显示器)显示一行。
2.5 保存编写好的程序
程序现在应如程序清单2.2所示,当然,可能第3行和第4行使用的空格略有不同。进行必要的改正,然后存储该文件(通过选择 File->Save 或 Save All Files 按钮来执行)。
程序清单2.2 Saluton程序的完整版本
计算机运行该程序时,将运行main语句块中的第3行和第4行。用英文而不是Java来编写该程序时,将如程序清单2.3所示。
程序清单2.3 Saluton程序的分解
2.6 将程序编译为 class文件
在运行Java程序之前,必须先编译它。在编译程序时,输入到计算机中的程序指令被转换为计算机可以更容易理解的一种形式。
在NetBeans中,程序在保存时会自动进行编译。如果你输入程序清单2.2中的指令,则该程序将顺利通过编译。
该程序在编译之后生成一个新的文件,名为Saluton.class。所有的Java程序都将编译为类(class)文件,且其文件后缀名为.class。Java程序也可以由协同工作的多个类文件组成,但是对于Saluton这样简单的程序来说,只需要一个类文件。
注意:
只有Java程序在编译出现错误时,Java编译器才会有提示。如果你成功地编译完了一个程序,期间没有任何错误,则Java编译器不会有任何“动静”。这有点虎头蛇尾。当我在刚开始学习Java编程时,我曾经希望在编译取得成功时,能够有所提示。
2.7 修复错误
当在NetBeans源代码编辑器中编译程序时,如果出现错误,在编辑面板中对应行的左边会出现一个红色警示图标,如图2.2所示。
图2.2 在源代码编辑器中定位错误
这个图标显示在触发错误的那一行代码上。可以单击该图标来显示该错误信息,该错误信息会用如下细节来解释这个编译器错误。
Java程序的名字。
错误的类型。
出错的行号。
比如,在编译Saluton程序时,可能会看到如下错误信息。
提示:
本书官方站点 www.java24hours.com包含了本书所有程序的源文件。如果你能确定 Saluton 程序的错误不是由输入原因造成的,同时又找不到其他原因,则可以去该书的官方站点下载Saluton.java程序,然后再运行该程序。
这里的错误消息是第一行“cannot find symbol”。很多编程新手往往会对这些消息感到迷惑。当读者不明白错误消息的意思时,不要为此枉费时间。只要看一下错误所在的行数,然后寻找最明显的原因即可。
例如,你能确定下面的语句哪里出错了么?
这里的错误是变量名输入错误,即变量名应该是greeting,而不是greting。
在创建Saluton程序时,如果提示有错误消息,可以检查你的程序是否与程序清单2.2中的相同,然后再修改你找到的不同之处。要保证每一个字母的大小写都是正确的,而且也包含了所有的标点符号(比如{、}和;)。
通常情况下,仔细检查错误消息指示的那一行,足以发现需要修复的所有错误。
2.8 运行 Java程序
要查看Saluton程序的结果是否如你所愿,可使用Java虚拟机(JVM)运行类文件,JVM就是运行所有 Java 代码的解释器。在 NetBeans中,选择菜单命令 Run->Run File。在源代码编辑器的下面将会打开输出面板(窗口)。如果没有错误,则该程序会在该面板中显示输出结果,如图2.3所示。
如果你看到了在 Java 程序中输入的文本“Saluton Mondo!”,那么你的计算机也就对世界发出了问候——这是计算机编程领域的一个传统,这对于很多程序员来说就像咖啡、短袖衬衫和 Call of Duty(使命召唤)一样重要。
图2.3 运行第一个Java程序
注意:
读者可能会问“为什么 Saluton mondo!是一句传统的问候语言呢”。该短语在世界语中的意思是“Hello world!”。而世界语是由 Ludwig Zamenhof在1887年创建的一种人工语言,用于国际间的交流。我在这里使用世界语,旨在希望更多的计算机人员学习它。
2.9 总结
在本章,读者使用 NetBeans IDE 创建了第一个 Java 程序,并学会了开发 Java 程序所需要的3个基本步骤。
1.使用文本编辑器编写程序。
2.将程序汇编为类文件。
3.让JVM运行该类文件。
与此同时,读者还学习了一些基本的计算机编程概念,如编译器、解释器、块、语句和变量。随着后续章节的学习,读者将会对这些概念越来越清晰。只要读者在本章成功地运行了Saluton程序,就可以进入下一章。
2.10 问与答
问:在Java程序的每行中插入适当数量的空格有多重要?
答:这完全不重要。空格无疑会让阅读计算机程序的人受益,但Java编译器对空格的数量并不关心。在编写 Saluton 程序时,你也可以不使用空格或 Tab 键进行缩进,而且它也能成功编译。
虽然每行开头的空格数不重要,但在Java程序中应采用一致的缩进方式。原因是空格有助于查看程序的组织结构以及语句所属的程序块。
问:Java程序被称为一个类和一组类。哪种说法是正确的?
答:两者都正确。在接下来几章中,你创建的简单 Java 程序将被编译为扩展名为.class的单个文件,你可以使用JVM来运行它们。Java程序也可以由一组协同工作的类组成。该主题将在第10章详细介绍。
问:既然每条语句都必须以分号结尾,为何注释行“//My first Java program goes here”不需要以分号结尾?
答:编译器会完全忽略掉注释行。如果在程序中加入“//”,则是告诉Java编译器忽略该行中“//”右边的所有内容。下面的例子演示了如何在语句所在的行添加注释:
问:我在编译器指出有错误的行中没有发现任何错误,我应该怎么办?
答:错误消息中显示的行号并不总是程序中发生错误的地方。检查错误消息指出的行号上面的行,看看能否找到拼写错误或其他bug。错误通常位于相同的程序块中。
2.11 测验
通过回答下列问题检测对本章介绍的知识的掌握程度。
1.编译Java程序时,你实际上做了什么工作?
a.将其存盘。
b.将其转换为计算机能够理解的格式。
c.将其加入到程序集合中。
2.什么是变量?
a.是摇摆但是不下降的东西。
b.程序中被编译器忽略的文本。
c.程序中用来存储信息的地方。
3.修复错误的过程叫什么?
a.解冻。
b.调试。
c.分解。
1.b.编译是将.java文件转换为一个或一组.class文件。
2.c.变量是用来存储信息的地方,后面将介绍其他存储信息的地方,如数组和常量。钟摆会摇摆但不会掉下来;注释是编译程序中被编译器忽略的文本。
3.b.由于在计算机程序中的错误叫bug,修复这些错误就叫调试(debugging)。有些编程工具自带了名为调试器(debugger)的工具,可帮助修复错误。
2.12 练习
如果想更多地探索本章介绍的主题,可完成下列练习:
将英文短语Hello world翻译成其他语言,翻译时可以使用Yahoo!网站的Babelfish,其网址为 http://babelfish.yahoo.com。编写一个程序,让计算机用法语、意大利语或葡萄牙语向世界问候。
在Saluton程序中故意添加一两个错误。例如,删除行尾的分号或将某行中的println改成print1n。保存文件再编译程序,比较由此产生的错误消息。
要获悉这些练习的答案,请访问本书的配套网站www.java24hours.com。