Java核心技术·卷Ⅰ:基础知识(原书第10版)
上QQ阅读APP看书,第一时间看更新

本章主要介绍如何安装Java开发工具包(JDK)以及如何编译和运行不同类型的程序:控制台程序、图形化应用程序以及applet。运行JDK工具的方法是在终端窗口中键入命令。然而,很多程序员更喜欢使用集成开发环境。为此,将在稍后介绍如何使用免费的开发环境编译和运行Java程序。尽管学起来很容易,但集成开发环境需要吞噬大量资源,编写小型程序时也比较烦琐。一旦掌握了本章的技术,并选定了自己的开发工具,就可以学习第3章,开始研究Java程序设计语言。

2.1 安装Java开发工具包

Oracle公司为Linux、Mac OS X、Solaris和Windows提供了Java开发工具包(JDK)的最新、最完整的版本。用于很多其他平台的版本仍处于多种不同的开发状态中,不过,这些版本都由相应平台的开发商授权并分发。

2.1.1 下载JDK

要想下载Java开发工具包,可以访问Oracle网站:www.oracle.com/technetwork/java/javase/downloads,在得到所需的软件之前必须弄清楚大量专业术语。请看表2-1的总结。

表2-1 Java术语

你已经看到,JDK是Java Development Kit的缩写。有点混乱的是:这个工具包的版本1.2~版本1.4被称为Java SDK(软件开发包,Software Development Kit)。在某些场合下,还可以看到这个过时的术语。另外,还有一个术语是Java运行时环境(JRE),它包含虚拟机但不包含编译器。这并不是开发者想要的环境,而是专门为不需要编译器的用户而提供。

接下来,Java SE会大量出现,相对于Java EE(Enterprise Edition)和Java ME(Micro Edition),它是Java的标准版。

Java 2这种提法始于1998年。当时Sun公司的销售人员感觉增加小数点后面的数值改变版本号并没有反映出JDK 1.2的重大改进。但是,由于在发布之后才意识到这个问题,所以决定开发工具包的版本号仍然沿用1.2,接下来的版本是1.3、1.4和5.0。但是,Java平台被重新命名为Java 2。因此,就有了Java 2 Standard Edition Software Development Kit(Java 2标准版软件开发包)的5.0版,即J2SE SDK 5.0。

幸运的是,2006年版本号得到简化。Java标准版的下一个版本取名为Java SE 6,后来又有了Java SE 7和Java SE 8。不过,“内部”版本号分别是1.6.0、1.7.0和1.8.0。

当Oracle为解决一些紧急问题做出某些微小的版本改变时,将其称为更新。例如:Java SE 8u31是Java SE 8的第31次更新,它的内部版本号是1.8.0_31。更新不需要安装在前一个版本上,它会包含整个JDK的最新版本。另外,并不是所有更新都公开发布,所以如果“更新31”之后没有“更新32”,你也不用惊慌。

对于Windows或Linux,需要在x86(32位)和x64(64位)版本之间做出选择。应当选择与你的操作系统体系结构匹配的版本。

对于Linux,还可以在RPM文件和.tar.gz文件之间做出选择。我们建议使用后者,可以在你希望的任何位置直接解压缩这个压缩包。

现在你已经了解了如何选择适当的JDK。下面做一个小结:

● 你需要的是JDK(Java SE开发包),而不是JRE。

● Windows或Linux:32位选择x86,64位以x64。

● Linux:选择.tar.gz版本。

接受许可协议,然后下载文件。

注释Oracle提供了一个捆绑包,其中包含Java开发包(JDK)和NetBeans集成开发环境。建议现在不要安装任何捆绑包,而只需安装Java开发包。如果以后你打算使用NetBeans,可以再从http://netbeans.org下载。

2.1.2 设置JDK

下载JDK之后,需要安装这个开发包并明确要在哪里安装,后面还会需要这个信息。

● 在Windows上,启动安装程序。会询问你要在哪里安装JDK。最好不要接受路径名中包含空格的默认位置,如c:\Program Files\Java\jdk1.8.0_version。取出路径名中的Program Files部分就可以了。

● 在Mac上,运行安装程序。这会把软件安装到/Library/Java/JavaVirtualMachines/jdk1.8.0_version.jdk/Contents/Home。用Finder找到这个目录。

● 在Linux上,只需要把.tar.gz文件解压缩到你选择的某个位置,如你的主目录,或者/opt。如果从RPM文件安装,则要反复检查是否安装在/usr/java/jdk1.8.0_version

在这本书中,安装目录用jdk表示。例如,谈到jdk/bin目录时,是指/opt/jdk1.8.0_31/bin或c:\Java\jdk1.8.0_31\bin目录。

在Windows或Linux上安装JDK时,还需要另外完成一个步骤:将jdk/bin目录增加到执行路径中——执行路径是操作系统查找可执行文件时所遍历的目录列表。

● 在Linux上,需要在˜/.bashrc或˜/.bash_profile文件的最后增加这样一行:

一定要使用JDK的正确路径,如/opt/jdk1.8.0_31。

● 在Windows上,启动控制面板,选择“系统与安全”(System and Security),再选择“系统”(System),选择高级系统设置(Advanced System Settings)(参见图2-1)。在系统属性(System Properties)对话框中,点击“高级”(Advanced)标签页,然后点击“环境”(Environment)按钮。

图2-1 Windows 7中设置系统属性

滚动“系统变量”(System Variables)列表,直到找到名为Path的变量。点击“编辑”(Edit)按钮(参见图2-2)。将jdk\bin目录增加到路径最前面,并用一个分号分隔新增的这一项,如下所示:

图2-2 Windows 7中设置Path环境变量

注意要把jdk替换为具体的Java安装路径,如c:\Java\jdk1.8.0_31。如果忽视前面的建议,想要保留Program Files部分,则要把整个路径用双引号引起来:"c:\Program Files\Java\jdk1.8.0_31\bin";其他目录。

保存所做的设置。之后新打开的所有控制台窗口都会有正确的路径。

可以如下测试设置是否正确:打开一个终端窗口,键入:

然后按回车键。应该能看到显示以下信息:

如果得到诸如“javac: command not found”(javac::命令未找到)或“The name specified is not recognized as an internal or external command, operable program or batch file”(指定名不是一个内部或外部命令、可执行的程序或批文件),就需要退回去反复检查你的安装。

2.1.3 安装库源文件和文档

库源文件在JDK中以一个压缩文件src.zip的形式发布,必须将其解压缩后才能够访问源代码。建议按照下面所述的步骤进行操作。很简单:

1)确保JDK已经安装,并且jdk/bin目录在执行路径中。

2)在主目录中建立一个目录javasrc。如果愿意,可以在一个终端窗口完成这个步骤。

3)在jdk目录下找到文件src.zip。

4)将src.zip文件解压缩到javasrc目录。在一个终端窗口中,可以执行以下命令:

提示src.zip文件中包含了所有公共类库的源代码。要想获得更多的源代码(例如:编译器、虚拟机、本地方法以及私有辅助类),请访问网站:http://jdk8.java.net

文档包含在一个压缩文件中,它是一个独立于JDK的压缩文件。可以直接从网站http://www.oracle.com/technetwork/java/javase/downloads下载这个文档。操作步骤如下:

1)下载文档压缩文件。这个文件名为jdk-version-docs-all.zip,其中的version表示版本号,例如8u31。

2)解压缩这个文件,将doc目录重命名为一个更有描述性的名字,如javadoc。如果愿意,可以从命令行完成这个工作:

这里version是相应的版本号。

3)在浏览器中导航到javadoc/api/index.html,将这个页面增加到书签。

还要安装本书的程序示例。可以从http://horstmann.com/corejava下载示例。这些程序打包在一个zip文件corejava.zip中。可以将程序解压缩到你的主目录。它们会放在目录corejava中。如果愿意,可以从命令行完成这个工作:

2.2 使用命令行工具

如果在此之前有过使用Microsoft Visual Studio等开发环境编程的经验,你可能会习惯于有一个内置文本编辑器、用于编译和启动程序的菜单以及调试工具的系统。JDK完全没有这些功能。所有工作都要在终端窗口中键入命令来完成。这听起来很麻烦,不过确实是一个基本技能。第一次安装Java时,你可能希望在安装开发环境之前先检查Java的安装是否正确。另外,通过自己执行基本步骤,你可以更好地理解开发环境的后台工作。

不过,掌握了编译和运行Java程序的基本步骤之后,你可能就会希望使用专业的开发环境。下一节会介绍如何使用开发环境。

首先介绍较难的方法:从命令行编译并运行Java程序。

1)打开一个终端窗口。

2)进入corejava/v1ch02/Welcome目录(CoreJava是安装本书示例源代码的目录,请参看2.1.3节)。

3)键入下面的命令:

然后,将会在终端窗口中看到图2-3所示的输出。

图2-3 编译并运行Welcome.java

祝贺你!你已经编译并运行了第一个Java程序。

那么,刚才都进行了哪些操作呢?javac程序是一个Java编译器。它将文件Welcome.java编译成Welcome.class。java程序启动Java虚拟机。虚拟机执行编译器放在class文件中的字节码。

Welcome程序非常简单。它只是向控制台输出了一条消息。你可能想查看程序清单2-1的程序代码。(在下一章中,将解释它是如何工作的。)

程序清单2-1 Welcome/Welcome.java

在使用可视化开发环境的年代,许多程序员对于在终端窗口中运行程序已经很生疏了。常常会出现很多错误,最终导致令人沮丧的结果。

一定要注意以下几点:

● 如果手工输入源程序,一定要注意大小写。尤其是类名为Welcome,而不是welcome或WELCOME。

● 编译器需要一个文件名(Welcome.java),而运行程序时,只需要指定类名(Welcome),不要带扩展名.java或.class。

● 如果看到诸如Bad command or file name或javac:command not found这类消息,就要返回去反复检查安装是否有问题,特别是执行路径的设置。

● 如果javac报告了一个错误,指出无法找到Welcome.java,就应该检查目录中是否存在这个文件。

在Linux环境下,检查Welcome.java是否以正确的大写字母开头。

在Windows环境下,使用命令dir,而不要使用图形浏览器工具。有些文本编辑器(特别是Notepad)在每个文件名后面要添加扩展名.txt。如果使用Notepad编辑Welcome.java就会存为Welcome.java.txt。对于默认的Windows设置,浏览器与Notepad都隐含.txt扩展名,这是因为这个扩展名属于“已知的文件类型”。此时,需要重新命名这个文件,使用命令ren,或是另存一次,为文件名加一对双引号,如:“Welcome.java”。

● 如果运行程序之后,收到关于java.lang.NoClassDefFoundError的错误消息,就应该仔细地检查出问题的类的名字。

如果收到关于welcome(w为小写)的错误消息,就应该重新执行命令:java Welcome(W为大写)。记住,Java区分大小写。

如果收到有关Welcome/java的错误信息,这说明你错误地键入了java Welcome.java,应该重新执行命令java Welcome。

● 如果键入java Welcome,而虚拟机没有找到Welcome类,就应该检查一下是否有人设置了系统的CLASSPATH环境变量(将这个变量设置为全局并不是一个提倡的做法,然而,Windows中有些比较差的软件安装程序就是这样做的)。可以像设置PATH环境变量一样设置CLASSPATH,不过这里将删除这个设置。

提示http://docs.oracle.com/javase/tutorial/getStarted/cupojava/上有一个很好的教程。其中提到了初学者经常容易犯的一些错误。

2.3 使用集成开发环境

上一节中,你已经了解了如何从命令行编译和运行一个Java程序。这是一个很有用的技能,不过对于大多数日常工作来说,都应当使用集成开发环境。这些环境非常强大,也很方便,不使用这些环境有些不合情理。我们可以免费得到一些很棒的开发环境,如Eclipse、NetBeans和IntelliJ IDEA程序。这一章中,我们将学习如何从Eclipse起步。当然,如果你喜欢其他开发环境,学习本书时也完全可以使用你喜欢的环境。

本节将介绍如何使用Eclipse编译一个程序。Eclipse是一个可以从网站http://eclipse.org/downloads上免费下载得到的集成开发环境。Eclipse已经有面向Linux、Mac OS X、Solaris和Windows的版本。访问下载网站时,选择“Eclipse IDE for Java Developers”。再根据你的操作系统选择32位或64位版本。

将Eclipse解压缩到你选择的位置,执行这个zip文件中的eclipse程序。

下面是用Eclipse编写程序的一般步骤。

1)启动Eclipse之后,从菜单选择File→New→Project。

2)从向导对话框中选择Java Project(如图2-4所示)。

图2-4 Eclipse中的“New Project”对话框

3)点击Next按钮,不选中“Use default location”复选框。点击Browse导航到corejava/v1ch02/Welcome目录(见图2-5)。

图2-5 配置Eclipse工程

4)点击Finish按钮。这个工程已经创建完成了。

5)点击工程窗口左边窗格中的三角,直到找到Welcome.java并双击。现在应该看到带有程序代码的窗口了(如图2-6所示)。

图2-6 使用Eclipse编辑源文件

6)用鼠标右键点击最左侧窗格中的工程名(Welcome),选择Run→Run As→Java Application。程序输出会显示在控制台窗格中。

可以假定,这个程序没有输入错误或bug(毕竟,这段代码只有几行)。为了说明问题,假定在代码中不小心出现了录入错误(或者甚至语法错误)。试着将原来的程序修改一下,让它包含一些录入错误,例如,将String的大小写弄错:

注意string下面的波折线。点击源代码下标签页中的Problems,展开小三角,会看到一个错误消息,指出有一个未知的string类型(见图2-7)。点击这个错误消息。光标会移到编辑窗口中相应的代码行,可以在这里纠正错误。利用这个特性可以快速地修正错误。

图2-7 Eclipse中的错误消息

提示通常,Eclipse错误报告会伴有一个灯泡图标。点击这个图标可以得到一个建议解决这个错误的方案列表。

2.4 运行图形化应用程序

Welcome程序并不会引起人们的兴奋。接下来,给出一个图形化应用程序。这个程序是一个简单的图像文件查看器(viewer),它可以加载并显示一个图像。首先,由命令行编译并运行这个程序。

1)打开一个终端窗口。

2)进入corejava/v1ch02/ImageViewer。

3)输入:

将弹出一个标题栏为ImageViewer的新程序窗口(如图2-8所示)。

图2-8 运行ImageViewer应用程序

现在,选择File→Open,然后找到一个图像文件并打开它(我们在同一个目录下提供了两个示例文件)。要关闭这一程序,只需要点击标题栏中的关闭按钮或者从菜单中选择File→Exit。

下面快速地浏览一下源代码(程序清单2-2)。这个程序比第一个程序要长很多,但是只要想一想用C或C++编写同样功能的应用程序所需要的代码量,就不会觉得它太复杂了。本书将在第10章~第12章介绍如何编写像这样的图形化应用程序。

程序清单2-2 ImageViewer/ImageViewer.java

2.5 构建并运行applet

本书给出的前两个程序是Java应用程序。它们与所有本地程序一样,是独立的程序。然而,正如第1章提到的,有关Java的大量宣传都在炫耀Java在浏览器中运行applet的能力。如果你对“过去的记忆”感兴趣,可以继续阅读下面的内容来了解如何构建和运行一个applet,以及如何在Web浏览器中显示;如果你不感兴趣,完全可以跳过这个例子,直接转到第3章。

首先,打开终端窗口并转到CoreJava/v1ch02/RoadApplet,然后,输入下面的命令:

图2-9显示了在applet查看器窗口中显示的内容。这个applet图示显示了司机随意减速可能导致交通拥堵的情况。1996年,applet是创建这种可视化显示的绝佳工具。

图2-9 在applet查看器窗口中显示的RoadApplet

第一条命令是大家已经非常熟悉的调用Java编译器的命令。它将RoadApplet.java源文件编译成字节码文件RoadApplet.class。

不过这一次不要运行java程序。首先,使用jar工具将类文件打包到一个“JAR文件”。然后调用appletviewer程序,这是JDK自带的一个工具,可以用来快速测试applet。需要为这个程序指定一个HTML文件名,而不是一个Java类文件名。RoadApplet.html文件的内容如本节最后的程序清单2-3所示。

程序清单2-3 RoadApplet/RoadApplet.html

如果熟悉HTML,你会注意这里的标准HTML标记和applet标签,这会告诉applet查看器加载applet,其代码存储在RoadApplet.jar中。applet会忽略除applet标签外的所有HTML标签。

当然,applet要在浏览器中查看。遗憾的是,现在很多浏览器并不提供Java支持,或者启用Java很困难。对此,最好使用Firefox。

如果使用Windows或Mac OS X, Firefox会自动启用计算机上安装的Java。在Linux上,则需要用下面的命令启用这个插件:

作为检查,可以在地址栏键入about:plugins,查找Java插件。确保使用这个插件的Java SE 8版本,为此要查找MIME类型application/x-java-applet; version=1.8。

接下来,将浏览器导航到http://horstmann.com/applets/RoadApplet/RoadApplet.html,对所有安全提示都选择接受,保证最后会显示applet。

遗憾的是,只是测试刚刚编译的applet还不够。horstmann.com服务器上的applet有数字签名。还必须再花一些工夫,让Java虚拟机信任的一个证书发行者信任我,为我提供一个证书,我再用这个证书为JAR文件签名。浏览器插件不再运行不信任的applet。与过去相比,这是一个很大的变化,原先在屏幕上绘制像素的简单applet会限制在“沙箱”中,即使没有签名也可以工作。可惜,即使是Oracle也不再相信沙箱的安全性了。

为了解决这个问题,可以临时将Java配置为信任本地文件系统的applet。首先,打开Java控制面板。

● 在Windows中,查看控制面板中的Programs(程序)部分。

● 在Mac上,打开System Preferences(系统首选项)。

● 在Linux上,运行jcontrol。

然后点击Security(安全)标签页和Edit Site List(编辑网站列表)按钮。再点击Add(增加),并键入file:///。点击OK,接受下一个安全提示,然后再次点击OK(见图2-10)。

图2-10 配置Java信任本地applet

现在应该可以在浏览器中加载文件corejava/v1ch02/RoadApplet/RoadApplet.html, applet将随周围的文本一同显示。结果如图2-11所示。

图2-11 在浏览器中运行RoadApplet

最后,在程序清单2-4中给出了这个applet类的代码。现在,只需要简单看一下。在第13章中,还会再来介绍applet的编写。

程序清单2-4 RoadApplet/RoadApplet.java

在本章中,我们学习了有关编译和运行Java程序的机制。现在可以转到第3章开始学习Java语言了。