Java从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

第1篇 基础知识

本篇从Java的基本概念及特性开始Java的学习之旅,并通过一些实例来了解Java的实际开发过程。

读者在学完本篇后将会了解到Java软件和编程的基本概念,掌握Java的基本操作及应用方法,为后面的学习打好基础。

第1章 揭开Java的神秘面纱

本章视频教学录像:1 小时47 分钟

通过上一章的阅读,相信你已经对Java语言有了大概的了解,本章更进一步地介绍如何在Windows和Linux的环境下下载与安装JDK,并详细描述Windows下开发环境的配置。最后介绍如何编译和运行第1个Java程序。

本章要点(已掌握的在方框中打钩)

□ 掌握下载、安装Java开发工具箱

□ 掌握开发环境变量的配置

□ 学会编写第 1个 Java 程序

1.1 Java开发环境

本节视频教学录像:2分钟

学习Java的第一步就是要搭建Java开发环境(Java Development Kit,JDK),它是在操作系统(如Windows、Linux等)下搭建的Java最基本的开发环境,目前由Oracle公司维护开发并免费提供。

JDK由一个处于操作系统层之上开发环境和运行环境组成,如下图所示。JDK除了包括编译(javac)、解释(java)、打包(jar)等工具,还包括开发工具及开发工具的应用程序接口等。当Java程序编译完毕后,如果想运行,还需要JRE(Java Runtime Environment,Java运行环境)。

JRE是运行JAVA程序所必需的环境的集合,包含JVM标准实现及Java核心类库。如果仅仅想运行Java程序,安装JRE就够了。也就是说,JRE是面向Java程序的使用者的。如果想开发Java程序,就需要安装JDK,它是面向Java程序的开发者。Java程序的开发者自然也是Java程序的应用者。从下图也容易看出,JDK包含JRE。

Tools & Tools APIs(工具与工具的应用程序接口)

由上图可以看出,Java程序开发的第一步就是编写Java语言的源代码。而编写源代码的工具可以是任何文本编辑器,如Windows 下的记事本、Linux下的Vim均可。这里推荐读者使用对编程语言支持较好的编辑器:Notepad++、UltraEdit、Editplus等。

Java源文件编写完毕后,就可以在命令行下通过javac命令将Java源程序编译成字节码(二进制文件),然后通过java命令来解释执行编译好的Java类文件(文件扩展名为.class)。但如果想正确使用javac和java等命令,用户必须自己搭建Java开发环境。在1.3节,我们将详细介绍此步骤。

采用Oracle公司提供的JDK开发Java程序,能够让初学者专注于Java语法的理解,代码模块之间的关系比较清晰明了,有利于初学者理解Java面向对象的设计思想。此外,JDK的版本也会随Java (J2EE、J2SE以及J2ME)版本的升级而升级。但它的缺点也是明显的,从事大规模企业级Java应用开发比较困难,也不利于团体协同开发。

因此,目前市面上出现了很多优秀的Java集成开发环境 (Integrated Development Environment,简称 IDE),如NetBeans和Eclipse等。IDE在JDK的基础上,为程序提供了很多辅助功能的支持,极大方便了程序的开发。在第2章我们将系统地介绍Eclipse的使用。

本节分别介绍两种应用最为广泛的操作系统—Windows和Linux环境下安装JDK的过程。

1.2 安装Java开发工具箱

Oracle公司提供多种操作系统下的不同版本的JDK。

1.2.1 下载JDK

JDK软件包的下载方法如下。

⑴ 首先登录Oracle官方网站下载最新版的JDK版本。在浏览器地址栏中输入www.oracle.com,打开Oracle官方网站,单击“Downloads(下载)”下载,如下图所示。

⑵ 如0.3节介绍, Java技术体系可以分为4个平台:Java SE(Standard Edition,标准版)、Java EE(Enterprise Edition,企业版)、Java ME(Micro Edition,微型版)和Java Card(智能卡版)。后面三个版本都是以Java SE为核心的,所以掌握Java SE最为重要,这也是本书的主要讲解范围。因此,在“Downloads”单击打开的网页中选择下载“Java SE”,如下图所示。

⑶ 进入正式下载页面http://www.oracle.com/technetwork/java/javase/downloads/index.html,如下图所示。

单击下载“Java Platform (JDK) 8u5”。需要读者注意的是,虽然我们下载的是Java 8,但Java 8的推广使用还需要假以时日,Java 7仍然是广泛应用的开发环境。

借助搜索引擎,如百度(www.baidu.com)或者谷歌(www.google.com.hk),输入关键字诸如“Java 7 下载”等,可以搜索到很多可用的下载地址,或者在下面的官方链接地址:http://www.oracle. com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html,也可以选择下载Java 7的最后更新版本,如下图所示。

而对于初学者来说,我们主要关注的是Java的基础知识的学习,在这点上,Java 7和Java 8没有太明显的差别。在后续的章节中,如果基础知识部分涉及Java 8的新特性时,我们会单独列出说明。

在Java 的发展过程中,其版本编号有一定的“混乱”性,容易让用户产生某种程度的困扰。譬如,有的时候读者朋友(特别是初学者)可能在阅读一些Java书籍时,发现版本为Java 2,如J2EE。有时又发现一些书籍说自己代码编译的平台是Java 6.0或Java 7.0,那Java 3 或Java 4 去哪里了?因此这里有必要给予解释一下。下面简要的介绍一下Java的版本号命名规则。

在Java 1.1之前,其命名方式和传统的方式一样。但当Java 1.1升级到Java 1.2时,Sun公司的Java市场推广部门觉得, Java的内涵发生了很大的变化,应给予Java一个“新”的名称——Java 2,而它内部的发行编号仍是Java 1.2。当Java内部发行版从1.2过渡到1.3和1.4时,Sun公司对外宣称的版本依然是Java 2.Sun公司从来没有发布过Java 3和Java 4。从Java的内部发行版的1.5开始,Java的市场推广部门又觉得Java已经变化很大,需要给予一个“新”的称呼来在市场中“博得眼球”,于是Java 1.5 直接对外宣称Java 5,依此类推,Java 1.6 对外宣称Java 6,而目前我们即将学到的Java 7,其内部版本是Java 1.7。如下表所示。

为了避免混淆,Oracle公司宣布改变Java版本号命名方式:自JDK 5.0起,Java以两种方式发布更新。第一种方式是Limited Update(有限更新)模式,其包含新功能和非安全修正。第二种方式是Critical Patch Updates(CPUs,重要补丁更新),只包含安全的重要修正。举例来说,Java SE 8u5的解释如下图所示。

⑷ 由于Oracle的Java实施的是“许可证(License)”,所以需要选择“ Accept License Agreement(接受许可证协议)”,然后选择与自己所使用操作系统匹配的SDK版本,如下图所示。

读者朋友可以根据自己的操作系统类型以及位数(32位的还是64位的),下载所对应的Java JDK。我们用下表详细说明上图所示的各种不同版本JDK的含义。

请注意,对于Linux版本而言,rpm为Red Hat和CentOS为代表的安装包,假设下载的是32位的rpm安装包:jdk-8u5-linux-i586.rpm,则其安装格式为:

rpm -ivh jdk-8u5-linux-i586.rpm

而以tar.gz的软件包则需要先解压,假设我们下载的是jdk-8u5-linux-i586.tar.gz,则需要用tar命令先解压:

tar zxvf jdk-8u5-linux-i586.tar.gz

然后在解压后的文件夹中查找安装文件jdk1.8.0_version,这里的version是下载时的次版本号,在不同时期下载,version可能是不同的,因为JDK总是不断在升级的。

Java 8的JDK软件包多在100MB以上,下载需要一定的时间,请读者耐心等待。下面为读者说明JDK在两种常用的操作系统——Windows和Linux下的详细安装流程。

1.2.2 在Windows 7中安装JDK

在下载过程中,有个小问题需要读者注意:如何识别自己所使用的Windows操作系统版本号?在Windows 7下,在桌面上鼠标右键单击“我的电脑”图标,选择“属性”命令,在弹出“属性”窗口下,如下图所示,“系统类型”处即可显示读者所用的操作系统版本信息。

目前,在笔者写作本书时, Java的JDK版本号是Java SE 8u5,但编程语言趋势是一直向上升级,只要大版本“8”不变,“u”后面的小版本号有所变化,基本上不会影响普通用户的学习。

安装环境介绍。

操作系统:64位Windows 7

安装软件:jdk-8u5-windows-x64.exe

⑴ 开始安装,下载完成后,就可以安装Java JDK。双击“jdk-8u5-windows-x64.exe”,具体流程如下图所示。

⑵ 选择安装路径,确定是否安装公共JRE。公共JRE提供了一个Java运行环境。JDK默认自带了JRE。可单击【取消】按钮,选择不安装公共JRE,并不会对Java运行造成影响。如下图所示。

⑶ 单击【Next】按钮,正在安装JDK,如图所示。

⑷ 安装公共JRE,如果在上一步中没有取消安装公共JRE,在安装JRE过程中会提示安装公共JRE。可以在本步骤中单击取消,不安装公共JRE。或者单击下一步按钮,安装公共JRE。

⑸ 正在安装公共JRE。

⑹ JDK安装完成。

⑺ 查看安装目录(C:\Program Files\Java)。如果安装了公共JRE,会在本目录下出现公共JRE安装后的目录(如下图所示),否则则没有。

⑻ 查看JDK安装目录(C:\Program Files\Java\jdk1.8.0_05)。JDK默认安装了JRE,提供了Java程序运行时默认环境,运行时并不使用公共JRE。

1.2.3 在Red Hat Enterprise Linux中安装JDK

Windows是Java程序员应用广泛的操作系统,但是Linux操作系统在服务器领域(如Red Hat)占据重要地位,其桌面系统(如Ubuntu)的市场份额也日益扩大。所以,学有余力的读者可以在Linux平台下开展Java程序开发。因此也有必要介绍一下Linux下安装JDK的流程。

在Linux环境下,在安装Java JDK之前,首先要下载正确的JDK软件包。下载的方式和Windows环境下的流程基本一致。但在判定用户所使用的操作系统版本上,是有所不同的。

笔者使用的Linux操作系统为Red Hat Enterprise Linux (RHEL) 6.5。下面在终端演示的几条命令,是下载JDK之前需要了解的操作系统信息。

⑴ 查询Linux操作系统是32位还是64位。使用命令getconf LONG_BIT或getconf WORD_BIT,如下图所示。

如果显示32则说明是Linux32位操作系统。类似的,如果显示为64,则说明Linux为64位操作系统,其中root是Linux的根用户(类似于Windows的超级管理员)。下面我们还可以用file命令来显示Linux的版本号。

⑵ 使用file /bin/ls显示Linux的版本号,如下图所示。

如果输出有32-bit字样,则说明是Linux 是32位操作系统。类似的,如果含有64-bit字样,则说明为Linux 是64位操作系统。

⑶ 查询Linux的发行版本。

在命令行模式下,输入 lsb_release -a ,即可列出所有版本信息,如下图所示。

上面输出说明当前的Linux操作系统为Red Hat Enterprise Linux Server release 6.5。根据上面的操作系统版本信息,我们选择单击下载32位的JDK:“jdk-8u5-linux-i586.rpm”,如下图所示。

安装环境介绍。

操作系统:Red Hat Enterprise Linux Server release 6.5 32位。

安装软件:jdk-8u5-linux-i586.rpm。

提示

RPM是RedHat Package Manager(RedHat软件包管理工具)类似于Windows操作系统下的“添加/删除程序”。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装,这样更加方便用户使用。

⑴ 将安装包下载至用户家目录(home)下的文件夹Downloads。

我们用pwd命令显示当前的工作目录,用ls -l 命令显示当前的工作目录下的文件列表,jdk-8u5-linux-i586.rpm就是我们要安装的文件,如下图所示。

⑵ 查询系统是否安装JDK。

使用rpm -qa | grep jdk 命令查看当前系统是否已安装了JDK;使用java -version 命令查看当前使用的JDK版本,如下图所示。

上图显示,我们的系统中并没有安装Java。如果安装了旧版本的,则需要先卸载旧版本。使用:

rpm -e --nodeps 【软件包名】

卸载指定的软件包。卸载完成后使用:

which java

命令确认JDK已完全卸载。

⑶ 安装Java 8 的JDK。

使用如下命令:

rpm -ivh jdk-8u5-linux-i586.rpm

安装JDK,如下图所示。其中rpm是安装命令,而-ivh是安装参数,具体含义读者可以用“man rpm”参考,这里不再赘述。

⑷ 测试JDK是否安装成功。

使用“java -version”来检测Java的版本号,如果检测到版本号,就间接说明安装成功。用“which java”来检测Java的安装路径,如下图所示。

需要读者注意的是,在Linux中,是区分大小写的。在bash命令行模式下,要使用小写的“java”,而非“Java”。

对于其他Linux发行版(如Ubuntu等),由于系统配置不同,安装JDK情况也可能不同,在安装完成JDK后还需要配置相关的环境变量,下面我们来说明Linux。

1.2.4 在Ubuntu操作系统中安装JDK

下面我们介绍如何在Ubuntu操作系统上安装JDK 8,这是Linux环境下最便捷的方法。

安装环境介绍。

操作系统:Ubuntu 14.04 LTS 32位

安装软件:jdk-8u5-linux-i586.tar.gz

Ubuntu 系统安装Java 8最简单的方式是通过Ubuntu的PPA( Personal Package Archives,个人软件包仓库)安装。PPA是专为Ubuntu 用户设计的软件仓库,类似于Windows下的奇虎公司的360软件管家。

⑴ 打开终端(快捷键Ctrl+Alt+t),在Ubuntu中添加PPA。

输入命令:sudo add-apt-repository ppa:webupd8team/java

⑵ 更新软件列表。

输入命令:sudo apt-get update

等待软件列表更新完成,如下图所示。

⑶ 安装 JDK 8。

输入命令:sudo apt-get install oracle-java8-installer。

①安装oracle-java8-installer会暂用部分硬盘空间,系统问是否继续,输入y,继续。

②oracle-java8-installer提示注意Oracle公司的Java SE的许可证协议,按回车键确认。

③选择接受许可证协议,用Tab键切换值<YES>处,按回车键确认。

④下载安装jdk-8u5-linux-i586.tar.gz,由于该文件较大,需要耐心等待一会。

⑷ 测试是否安装成功。

待上述安装流程完毕后,输入命令。

      java -version

检测Java的版本号码,间接验证Java是否安装成功(需要注意的是,在Linux中,有关Java的命令都是小写的java,否则会出错)。

从提示中,可以看出java 1.8.0_05安装成功。

如果原来已经安装有Java 7,想要设置 Java 8 为默认的编译环境,则需在终端输入下面的命令:

      sudo apt-get install oracle-java8-set-default

如果工作需要,想将编译环境切换为 Java 7,在终端输入下面的命令:

      sudo update-java-alternatives -s java-7-oracle

类似,如果重新切换为 Java 8,在终端输入下面的命令:

      sudo update-java-alternatives -s java-8-oracle

1.3 磨刀不误砍柴工——环境变量的配置

本节视频教学录像:44分钟

环境变量的配置主要包括了解环境变量和具体配置过程等。

1.3.1 理解环境变量

本书主要以Windows 7为操作系统载体来讲解Java。而在开发Java程序之前,通常需要先在Windows操作系统中配置好有关Java的系统环境变量(Environment Variable)。

在介绍环境变量的含义之前,我们先举一个形象的例子,给读者一个感性的认识。比如我们喊一句:“张三,你妈妈喊你回家吃饭!”可是“张三”为何人?他在哪里呢?对于我们人来说,认不认识“张三”都能给出一定的响应,如认识他,可能就会给他带个话;而不认识他,也可能帮忙吆喝一声“张三,快点回家吧!”

然而,对于操作系统来说,假设“张三”代表的是一条命令,它不认识“张三”是谁,也不知道“它”来自何处,它会“毫无情趣”的说,我“不认识“张三”: “not recognized as an internal or external command,然后拒绝继续服务。

为了让操作系统“认识”张三,我们必须给操作系统有关张三的精确信息,如“XXX省YYY县ZZZ乡QQQ村张三”,但其他的问题又来了,如果“张三”所代表的命令是用户经常用到的,每次使用“张三”,用户都在终端敲入“XXX省YYY县ZZZ乡QQQ村张三”,这是非常繁琐的,能不能有简略的办法呢?聪明的系统设计人员想出了一个简易的策略——环境变量。把“XXX省YYY县ZZZ乡QQQ村”设置为常见的“环境”,当用户在终端仅仅敲入“张三”时,系统自动检测环境变量集合里有没有“张三这个人,如果在”“XXX省YYY县ZZZ乡QQQ村”找到了,就自动替换为一个精确的地址“XXX省YYY县ZZZ乡QQQ村张三”,然后继续为用户服务。如果整个环境变量集合里都没有“张三”,那么再拒绝服务,如下图所示。

操作系统里没有上/下行政级别的概念,但却有父/子文件夹的概念,二者有“曲艺同工”之处。对“XXX省YYY县ZZZ乡QQQ村”这条定位“路径”,操作可以用“/”来区分不同级别文件夹,即:”“XXX省/YYY县/ZZZ乡/QQQ村””,而“张三”就像这个文件夹下的命令文件。

下面我们给出环境变量的正式定义。

环境变量是指在操作系统指定的运行环境中的一组参数,它包含一个或多个应用程序使用的信息。环境变量一般是多值的,即一个环境变量可以有多个值,各个值之间以英文状态下的分号“;”(即半角的分号)分隔开来。

对于Windows等操作系统来说,一般都有一个系统级的环境变量Path(路径)。当用户要求操作系统运行一个应用程序,却没有指定应用程序的完整路径时,操作系统首先会在当前路径下寻找该应用程序,如果找不到,便会到环境变量路径“Path”指定的路径下寻找。若找到该应用程序则执行它,否则会给出错误提示。用户可以通过设置环境变量来指定自己想要运行的程序的所在位置。

例如,编译Java程序需要用到javac命令,运行Java程序需要java命令。而这两个命令并不是Windows系统自带的命令,所以用户需要通过设置环境变量(JDK的安装位置)来指定这两个命令的位置。设置完成后就可以在任意目录下使用这两个命令了,而无需每次都要输入这两个命令的所在的精确全路径(如C:\Program Files\Java\jdk1.8.0_05)。javac和java等命令都放在JDK安装目录的bin目录下。基于类似于环境变量“Path”相同的理由,我们需要掌握JDK中最重要的3个环境变量,下面一一给予介绍。

1.3.2 配置JDK中的3个环境变量

对于环境变量中相关变量的深刻理解极为重要,特别是ClassPath,在日后的Java学习开发过程中会发现,很多问题的出现都与ClassPath环境变量有关。在学习如何配置这些环境变量之前,很有必要深刻理解下面3个环境变量代表的含义。

⑴ JAVA_HOME:顾名思义,”JAVA的家“——该变量是指安装Java的JDK路径,它告知操作系统在哪里可以找到JDK。

⑵ Path:前文已经有所介绍。该变量是告诉操作系统可执行文件的搜索路径,即可以在哪些路径下找到要执行的可执行文件,请注意它仅对可执行文件有效。当运行一个可执行文件时,用户仅仅给出该文件名,操作系统首先会在当前目录下搜索该文件,若找到则运行它,若找不到该文件,则根据Path变量所设置的路径,逐条到Path目录中搜索该可执行文件。

⑶ ClassPath:该变量是用来告诉Java解释器(即java命令)在哪些目录下可找到所需要执行的class文件(即javac编译生成的字节码文件)。

对于初学者来说,Java的运行环境的配置比较麻烦,请读者按照以下介绍实施配置。

1. JAVA_HOME的配置

下面我们详细说明Java的环境变量配置流程。

⑴ 在桌面中右击【我的电脑】,在弹出的快捷菜单中选择【属性】选项,如下图所示。

⑵ 在弹出的界面左上方,选择【高级系统设置】选项,如下图所示。

⑶ 单击【高级系统设置】选项后弹出【系统属性】对话框,然后单击【高级】->【环境变量】,如下图所示。

⑷ 在【环境变量】对话框中,单击【系统变量】下的【新建】按钮,显示如下图所示。

⑸ 在【编辑系统变量】对话框中输入,变量名为:“JAVA_HOME”,变量值为:C:\Program Files\Java\jdk1.8.0_05。特别需要读者注意的是,这个路径的具体值是根据读者安装JDK的路径而定,读者把Java安装在哪里,就把对应的安装路径放置于环境变量之内,不可拘泥于本书演示的这个路径值。然后,单击【确定】按钮,如下图所示。

注意

假设JDK安装在“C:\Program Files\Java\jdk1.8.0_05”,在设置完毕对应的环境变量JAVA_HOME后,以后再要用到这个变量时,需用两个%将其包括起来。如要设置另外一个环境变量值为“C:\Program Files\Java\jdk1.8.0_05\bin”,那么我们可以简单的用“%JAVA_HOME%\bin”代替即可。

2. Path的配置

⑴ 选中系统环境变量中的Path,单击【编辑】按钮,如下图所示。

⑵ 在弹出的【编辑系统变量】对话框的【变量值】文本框中,在文本框的末尾添加:“;%JAVA_HOME%\bin”,特别注意不要忘了前面的分号“;”,然后单击【确定】按钮,返回【系统属性】对话框,如下图所示。这里的%JAVA_HOME%就是指代前面设置的“C:\Program Files\Java\jdk1.8.0_05”,这里主要是为了方便起见,避免每次引用这个路径都输入很长的字符串。如果不怕麻烦,“;%JAVA_HOME%\bin”完全可以用全路径“;C:\Program Files\Java\jdk1.8.0_05\bin”代替之。这个路径务必设置正确,因为诸如Java语言的编译命令javac和解释命令java等都是在这个路径下,设置失败,这些命令将无法找到。注意:Path路径都是系统路径,配置的过程中要小心,以防无意删掉,最好先备份到文档中。

注意

当Path有多个变量值时,一定要用半角(即英文输入法)下的“;”将多个变量值区分开。初学者很容易犯错的地方:(1)忘记在上一个Path路径值前面添加分号“;”(2)没有切换至英文输入法,误输入中文的分号“;”。英文分号是1个字节大小,而中文的分号是2个字节大小。

⑶ 在【系统属性】对话框中单击【确定】按钮,完成环境变量的设置,如下图所示。

请注意,检测环境变量是否配置成功,在命令行模式下,在任意目录下用javac命令来检验,如果能输出javac的用法提示,则说明配置成功,如下图所示。

进入命令行模式的方法是,单击Windows 7的【开始】菜单,在搜索框中输入CMD命令,然后回车即可。

3. ClassPath的指定

ClassPath的设定对初学者来说,有一定的难度,容易配错。如果说JAVA_HOME指定的是java命令的运行路径的话,那么ClassPath指定的就是java加载类的路径,只有类在ClassPath中,java命令才能找到它,并解释它。

在Java中可以使用“set classpath”命令指定Java类的执行路径。下面通过一个例子来了解一下classpath的作用,假设这里的“Hello.class”类位于“C:\”目录下。

在“D:\”目录下的命令行窗口执行下面的指令。

        set classpath=c:

之后在“D:\”目录下执行“java Hello”命令,如下图所示。

从上图所示的输出结果可以发现,虽然在“D:\”目录中并没有“Hello.class”文件,但是也可以用“java Hello”执行“Hello.class”文件。之所以会有这种结果,就是因为在“D:\”目录中使用了“set classpath”命令,它把类的查找路径指向了“C:\”目录,在运行java时,会从ClassPath 中查找这个Hello类文件,而ClassPath 中包括了“C:\”,所以运行成功。

注意

在设置classpath时,最好将classpath指向当前目录,即所有的class文件都从当前文件夹中开始查找:“set classpath=.”。在命令行输入命令时,不包括上面的引号“ ”。在Windows及Linux等操作系统下,一个点“.”代表当前目录,两个点“..”代表上一级目录。

但是这样的操作行命令操作模式,实际上又会造成一种局限:每一次启动命令行窗口所设置的ClassPath都只是针对于当前命令行窗口有效。一旦重新开启命令行窗口,或系统重启,命令行临时设置的ClassPath中变量值都丢失了。如果想“一劳永逸”,最好的办法还是将ClassPath设置为环境变量。

⑴ 参照上一节中JAVA_HOME的配置,在【环境变量】对话框中,单击【系统变量】下的【新建】按钮,如下图所示。新建一个环境变量,变量名为:CLASSPATH,变量值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar。注意不要忽略了前面的 "." ,这里的小点“.”代表的是当前路径,既然是路径,自然也需要用分号“;”隔开。JDK的库所在包即tools.jar,所以也要设置进ClassPath中。

注意

Windows系统环境下,一般只要设置好JAVA_HOME就可以正常运行Java程序。默认的ClassPath是当前路径(即一个点 “.”)。有些第三方的开发包,需要使用到环境变量ClassPath,只有这样才能够使用JDK的各种工具。Windows下不区分大小写,ClassPath和CLASSPATH是等同的,可根据读者习惯自己选择大小写

⑵ 在按照步骤⑴设置后,如果在Java类(即.class)文件所存储的当前路径下,那么用“java+类名”方式解释执行用户类文件,这是没有问题的。但是如果用户更换了路径,现在的“当前路径”里没有在.class文件,那么“java”就无法找到这个类文件。

这时,即使在命令行下给出.class文件所在的全路径,java依然会出错,这会让初学者很困惑。下面具体说明,假设Java文件Hello.java存在在“D:\src\chap01\”路径下,由于JAVA_HOME和Path环境变量正确,用户可以正确编译、运行,使用javac和java命令无误,如下图所示。

但是如果用户切换了路径,比如使用“cd”命令切换至“D:\src\”,再次用java运行Hello类文件,就会得到错误信息:“Error: Could not find or load main class TestJava2_1”,如下图所示。这是因为Java在ClassPath里找不到Hello.class,因为现在的这个当前路径(也就是那个“.”代表的含义)已经变更为“D:\src\”,而“D:\src\”路径下确实没有Hello.class这个文件。

所以如果想在任意路径下执行用户的类文件,就必须把用户自己编译出的类文件所在路径,这里指的是“D:\src\chap01”,也加入到ClassPath中,并用分号“;”与前一个变量隔开,如下图所示。

⑶ 最后,参照环境变量Path的配置,将环境变量CLASSPATH添加到Path的最后,如下图所示。CLASSPATH是环境变量,在另外一个地方作为变量使用时,要用两个%将该变量前后包括起来。

如果用户原来的命令行终端窗口一直开启着,则需要关闭再重启命令行窗口,这是因为需要重新更新命令行窗口的环境变量。之后,就可以在任意路径下执行用户自己的类文件,如下图所示。

1.4 享受安装成果——开发第1个Java程序

本节视频教学录像:18分钟

现在就自己来动手编写一个Java的程序,亲自感受一下Java语言的基本形式。需要说明的是, Java程序分为两种形式:一种是网页上使用的Applet程序(Java小程序),该程序可以嵌入在 HTML(标准通用标记语言的一个应用)页中。另一种是Application程序(即Java应用程序),本书主要讲解的是Java应用程序。下面就以Java应用程序为例,开始我们第1个Java程序。

【范例1-1】 编写Hello.java程序。

        01 public class Hello
        02 {
        03   //main是程序的起点,所有程序由此开始运行
        04   public static void main(String args[])
        05   {
        06     //下面语句表示向屏幕上打印输出“Hello World!”字符串
        07     System.out.println("Hello World!");
        08   }
        09 }

【运行结果】

将上面的程序保存为“Hello.java”文件。行号是为了让程序便于被读者(或程序员)理解而人为添加的,真正Java源代码是不需要这些行号的。在命令行中输入“javac Hello.java”,没有错误后输入“java Hello”。运行结果如下图所示,显示“Hello World!”。

Java程序运行的流程可用如右图来说明:所有的Java源代码(以.java为扩展名),通过Java编译器javac (javac命令中字母c来自于compiler的首字母)编译成字节码,也就是以.class为扩展名的文件。然后利用命令java将对应的字节码通过Java虚拟机(JVM)解释为特定操作系统(如Windows、Linux等)能理解的机器码,最终Java程序得以执行。

这里需要注意的是,此处的java命令在Windows操作系统下,不区分大小写,诸如java 和JavA都是等同的。而在Linux等类UNIX系统下,由于区分大小写,javac和java命令等的所有命令字符都必须小写。

上面的程序如果暂时不明白也没有关系,读者只要将程序在任意纯文本编辑器(如Windows下的记事本、Notepad++、Linux下的vim等均可)里敲出来,然后按照步骤编译、执行就可以了。这里只是让读者对Java Application程序有一个初步印象,因为以后所有的内容都将围绕Java Application程序进行。

下面我们来解读一下这个Java小程序,让读者对Java程序有个初步的认知。更为详细的知识点读者可以参考后续相关章节进行学习。

第1行。public 是一个关键字,用于声明类的权限,表明这是一个公有类(class),其他任何类都可以直接访问它。class 也是Java的一个关键字,用于类的声明,其后紧跟的就是类名,这里的类名称是Hello。

第2行和第9行。这一对大括号{}标明了类的区域,在这个区域内的所有内容都是类的一部分。

第3行和第6行。这两行为注释行,可以提高程序的可读性。注释部分不会被执行。这种注释属于单行注释,要求以双斜线//开头,后面的部分均为注释。

第4行。这是一个main方法,它是整个Java程序的入口,所有的程序都是从public static void main(String args[])开始运行的,该行的代码格式是固定的。String args[]不能漏掉,如果漏掉,在一些编辑器中,如Eclipse,该类不能被识别执行。另外String args[]也可以写成String [] args,String为参数类型,表示为字符串型,args是arguments(参数)的缩写。public 和static都是Java的关键词,它们一起表明main是公有的静态方法。void也是Java的关键词,表明该方法没有返回值。对于这些关键词,读者可以暂时不用深究,在后面的章节中会详细讲解main方法的各个组成部分。

第5行和第8行是main方法的开始和结束标志,它们声明了该方法的区域,在{}之内的语句都属于main方法。

第7行System.out.println是Java内部的一条输出语句。引号内部的内容"Hello World !"会在控制台中打印出来。

1.5 探秘Java虚拟机(JVM)

本节视频教学录像:10分钟

在上一个小节中,我们看到Java编译器——javac仅仅将源代码编译成.class文件,然后通过命令java将.class文件送往Java虚拟机(JVM),变成最终可执行的程序。下面我们就Java虚拟机的机制进行简单的讨论。

Java中的虚拟机的概念,可以看作是在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机却是相同的。

Java程序得以执行的环境称之为Java运行时环境(Java Runtime Environment, 简称JRE),它由Java的虚拟机JVM和Java 的API构成。一个Java程序若想运行在Java虚拟机之中,源代码的语句需由Java编译器编译成字节码。字节码本质上是一种标准化的可移植的二进制格式。该格式以Java类文件(.class)的形式存在。一个Java程序可有多个不同的.class文件构成。在早期发布大型的Java程序,通常把多个.class文件打包成一个发布文件.jar ,其扩展名来自于“java archive”(java 归档文件)的简写。

Java虚拟机在执行.class或jar文件时,使用到“即时编译器”(JIT compiler,just-in-time compiler)。“即时编译器”是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器(processor)指令的程序。本质上,“即时编译器”是Java程序的第二个编译器,它能把通用的字节码编译成特定系统的机器指令代码。但是这里的二次编译,对用户来说基本上是“透明的”—即它存在但用户无需感知。

值得一提的是,另外一种网络编程常见语言—Python,也可以通过jpython(Python的纯java实现版本)编译后,同样也生成Java编译生成一样的字节码,从而也大大提供了该类程序的可移植性。但python不在本书讨论的范围。

1.6 高手点拨

本节视频教学录像:5分钟

1. 注意Java相对C++的一些特性

由于Java语言的设计者十分熟悉C++语言,所以在设计时很好地借鉴了C++语言。可以说, Java语言是比C++语言“更加面向对象”的一种编程语言。Java语言的语法结构与C++语言的语法结构十分相似,这使得C++程序员学习Java语言更加容易。

如果读者是从C++过渡而来的Java学习者,那么下面几个特性值得读者注意。

⑴ 提供了对内存的自动垃圾回收(Garbage Collection),程序员无需在程序中进行分配、释放内存,那些可怕的内存分配错误不会再打扰设计者了。

⑵ 去除了C++语言中容易出错的“指针”,而是用诸如“引用(reference)”的方法来取而代之。避免了赋值语句(如a = 3)与逻辑运算语句(如a = = 3)的混淆。

⑶ 取消了多重继承这一复杂的概念。多重继承会导致类中数据成员的“二义性”等问题,从而使得类的访问结构非常复杂。

2. 重视Java官网的文档

Java 7的语言规范(The Java® Language Specification Java SE 7 Edition)是公开的,可在Oracle的官方网站上下载(http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf)。阅读Java语言的规范是提高技术水平的好方法。

3. 如何在命令行模式下正确运行Java类文件

使用javac编译java源代码生成对应的.class文件,比如,范例1-1所示的Hello.class,然后用java来运行这个类文件,初学者很容易犯错,最有可能得到如下错误信息。

        Error: Could not find or load main class Hello.class

产生这种错误的原因通常有两个。

⑴ Java环境变量JAVA_HOME及ClassPath设置不正确,在设置环境变量时,在前一个环境变量前一定要用分号“;”以此区分不同的环境变量。同时要把当前目录“.”放进环境变量中。这里的一个小点“.”代表的就是class类文件所在的当前目录。

⑵ 有可能初学者在命令行模式下按如下方式来运行这个类文件。

        java Hello.class

而正确的方式为:

        java Hello

也就是说,java操作的对象虽然是类文件,但是却无需类文件的扩展名.class。

4. 正确保存Java的文件名

对于包括public类名的Java源程序,在保存时,初学者需要注意该源程序的名称需要和public类名称保持完全一致,如下所示的一个类。

        public class Hello

这个公有类名名称为Hello,那么这个类所在的源文件必须保存为Hello.java,由于Java语言是区分大小写的,保存的Java文件名(除了扩展名.java)必须和公有类的名称一致,包括大小写也一致。例如,如果公有类的名称为HEllo,而文件保存为Hello.java,虽然二者仅有一个字符“E”的在大小写上有差异,但依然无法通过编译,会得到如下错误。

        error: class HEllo is public, should be declared in a file named HEllo.java
        public class Hello
        1 error

上述错误信息的第一句就是提示包含公有类HEllo的文件,应保存的文件名为HEllo.java,而不是目前保存的Hello.java。

需要注意的是,对于没有包括public类的源文件,源文件的名称和非public类的名称可以不相同。

1.7 实战练习

本节视频教学录像:15分钟

编写一个Java程序,运行后在控制台中输出“不抛弃,不放弃。Java, I am coming!”。