一.JVM、JRE和JDK的概念
对于初学者来说,这三个术语出现的频率很高,而且有关这它们的问题在面试题中也会经常出现。因此,理解它们的定义、区别和联系就显得尤为重要。在学习这几个专业术语之前,我们先来了解一下Java代码的编译运行过程。
机器语言是用二进制代码表示的,能够被计算机直接识别和执行的一种机器指令的集合。也就是说,通过机器语言,我们可以直接操控电脑去做任何我们想要执行的操作。但是,由于机器语言是用二进制表示的,这就导致了它学习成本高、代码晦涩难懂、不便于调试等缺点。试想一下,写代码只用0和1,每个指令都要查手册,而且一旦手误写错一个数字,很难靠肉眼识别出来,这对于程序员来说,无疑是一件非常痛苦的事。
高级语言是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),它的学习成本相对于机器语言来说大大降低,从而使程序编写更容易,亦有较高的可读性。编译器是将高级语言翻译成机器语言的软件,使用高级语言编写的代码经过编译器翻译以后得到电脑可以直接执行的机器语言代码,这就相当于变相地编写机器语言。电脑领域已经发明了成百上千种编程语言,每种语言都有对应的编译器。在编写高级语言之前,首先要确保电脑上已经安装了对应的编译器。
高级语言大体上可分为编译型语言和解释型语言。编译型语言首先将源代码通过编译器生成机器语言代码,再由电脑运行生成的机器语言代码。像C和C++等都是编译型语言。解释型语言不需要事先编译,直接将源代码解释成机器语言并立即执行,每次执行都需要重新翻译。像Python和JavaScript等都是解释型语言。
Java语言是一种特殊的存在。Java源代码(文件后缀名为.java)首先经过编译之后转换为一种称为Java字节码的中间语言(文件后缀名为.class),再由Java虚拟机对字节码进行解释和执行。如果说它是编译型语言,它编译之后得到的并不是机器语言代码,无法直接运行,这与编译型语言的定义相矛盾;但是如果说他是解释型语言,似乎也不太合理,因为它在解释之前有一个编译过程。因此,可以说它既是编译型语言,又是解释型语言,也可以说它既不是编译型语言,又不是解释型语言。
现在回过头来看JVM、JRE和JDK的概念。JVM(Java Virtual Machine,Java虚拟机)是将Java字节码解释给本地系统运行的软件。JVM是Java实现其平台无关性特点的关键。Java语言使用JVM屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。
但是只有JVM还不能执行字节码,因为在解释字节码的时候JVM需要调用解释所需要的类库。JRE(Java Runtime Environment,Java运行时环境)是运行Java程序所必需的环境的集合,包含JVM标准实现及Java核心类库。也就是说,如果要运行Java程序,那么电脑上必须安装JRE。
安装JRE之后,我们就可以在电脑上运行编译好的Java程序了。这对于Java程序的用户来说足够了,但是如果是Java开发人员,那么只安装JRE将无法进行Java开发,因为无法将Java源代码编译成字节码。JDK(Java Development Kit,Java开发工具包)中包含了编译Java源代码的工具javac,提取Java文档的工具javadoc等工具和JRE。因此,安装JDK以后,我们既可以进行Java的开发,也可以运行Java程序。下面这张图很好地说明了这三者之间的关系:
二.安装JDK
1.下载JDK
正如上一篇文章中所说,我们选择安装JDK11。这里是它的下载地址。个人比较喜欢压缩包的安装方式,所以这里选择windows64位的zip文件。注意要勾选Accept License Aggrement。
将下载的压缩包解压至任何你想要安装的位置。这里我将解压出的jdk-11文件夹放在了F盘的env文件夹下。
2.配置环境变量
接下来需要配置环境变量Path和JAVA_HOME。首先介绍一下为什么需要配置这两个环境变量。Path环境变量用来指定cmd中可执行文件的搜索路径。编译Java源代码需要使用javac.exe,运行字节码需要使用java.exe,如果没有配置这两个可执行文件的路径,那么在cmd中使用这两个命令时将会出现“xxx不是内部或外部命令”的错误。而JAVA_HOME环境变量则是用来定义JDK的安装路径。在一个环境变量中可以使用其他环境变量的值,使用时需要在其他环境变量前后加%。例如,JDK的安装路径是F:envjdk-11,那么JAVA_HOME也需要配置为F:envjdk-11。javac.exe和java.exe的路径为F:envjdk-11in,那么Path中只需要配置%JAVA_HOME%in即可。这样做的一个好处是,如果要切换或修改JDK的路径,只需要修改JAVA_HOME的值。另外一个需要配置JAVA_HOME的原因是,许多组件依赖于Java的环境,如果不配置JAVA_HOME环境变量,这些组件将会因为找不到Java的安装路径而报错,例如tomcat、maven等。
在许多其他有关配置JDK环境变量的教程中都配置了CLASSPATH,但是从Java1.5开始就可以不配置这个环境变量了,而且每篇教程里CLASSPATH的值都不一样,有配置rt.jar的,有配置dt.jar的,也有配置tools.jar的,这对于初学者来说非常不友好。这里我们选择不配置CLASSPATH变量。
最后再来介绍一下系统变量和用户变量。在配置每个环境变量时,既可以将其配置在系统变量里,又可以配置在用户变量里。但是系统变量对所有用户都有效,而用户变量只对当前用户有效。并且系统变量的优先级高于用户变量,也就是说如果一个环境变量在系统变量和用户变量中都进行了配置,那么电脑将优先使用系统变量。因为系统变量中有许多比较重要的环境变量,所以我选择在用户变量中配置Path和JAVA_HOME变量。
如果是使用IDEA(一个JDK的集成开发环境,下文会讲到)进行开发的话,Path变量是没有必要配置的,因为可以在IDEA中配置Java的安装路径。但是为了演示在cmd中使用javac和java命令,我们将同时配置Path和JAVA_HOME变量。
下面是具体的配置步骤:
(1)右键我的电脑,属性,找到高级系统设置;
(2)高级,环境变量;
(3)在用户变量中新建JAVA_HOME变量,复制JDK的安装路径并粘贴到变量值,确定;
(4)在用户变量中编辑Path变量(如果没有就新建),填入%JAVA_HOME%in,确定;
之后一直点击确定即可退出环境变量的配置。至此,JDK的环境变量就全部配置完成了。此时可以打开cmd测试一下(如果配置前已经打开了cmd,需要关闭并重新打开,因为环境变量会在下一次打开cmd时才生效)。输入javac -version和java -version,看到如下输出则表示配置成功:
三.第一个Java程序--HelloWorld
下面我们将编写一个非常简单的Java程序来体验Java代码的编写、编译和运行。
首先新建一个文本文档,然后编写以下代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!"); // Display the string.
}
}
保存,然后将文件名修改为“HelloWorld.java”。打开cmd,切换到这个文件所在的目录(我将这个文件放在了F盘的根目录下),然后运行javac HelloWorld.java进行编译,此时会在目录中看到生成了一个HelloWorld.class文件,这个文件就是编译之后生成的字节码。接着运行java HelloWorld(这里不用加.class后缀),命令行将会输出“Hello World!”。
这里看不懂没有关系,我们会在后面的文章中对每一个语法进行介绍。
四.集成开发环境
上一节中,我们已经了解了如何从命令行编译和运行一个Java程序,这是一个很有用的技能。但是每次编译和运行都要手动输入命令则会显得有点麻烦。集成开发环境(Integrated Development Environment,以下简称IDE)集成了这些功能,在编写完代码后只需要点击运行按钮,IDE将会在后台自动为我们执行这些命令并将输出显示在控制台上。当然,IDE的功能远不止于此,它还提供了调试、分析、自动补全、语法检测等许多功能,它使得我们的开发工作更加轻松高效。
Java的IDE有很多,其中最出名的要属eclipse和Intellij IDEA了。eclipse是一个开源的、免费的集成开发环境。笔者刚开始学习Java使用的就是这款IDE,直到后来遇到了IDEA。个人更加喜欢IDEA,功能非常强大,界面也很美观。网上有很多人就eclipse和IDEA哪个更好展开了激烈的讨论,在我看来这是没有必要的。IDE只是一个工具,每个人选择自己用着顺手的工具就可以了,我们真正关注的编程语言本身,而不是使用什么工具并且说服别人一定要去用什么工具。在后面的教程中我都会使用IDEA进行讲解。
IDEA分为社区版(Community)和旗舰版(Ultimate),社区版免费,但是相对于旗舰版来说少了很多功能,不过对于Java初学者来说肯定是够用了。旗舰版收费,而且非常贵,第一年的价格是499美刀,之后每年便宜100美刀,第三年及以后都是299美刀。学生党可以凭借教育网邮箱(后缀为.edu.cn的邮箱)申请免费试用。如果不是学生党到但是还是想使用旗舰版的话,这里推荐一个提供免费注册码的网站,上面有详细的教程。