一.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:\env\jdk-11,那么JAVA_HOME也需要配置为F:\env\jdk-11。javac.exe和java.exe的路径为F:\env\jdk-11\bin,那么Path中只需要配置%JAVA_HOME%\bin即可。这样做的一个好处是,如果要切换或修改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%\bin,确定;



  之后一直点击确定即可退出环境变量的配置。至此,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的邮箱)申请免费试用。如果不是学生党到但是还是想使用旗舰版的话,这里推荐一个提供免费注册码的网站,上面有详细的教程。

Java基础教程(2)--Java开发环境的更多相关文章

  1. Java基础教程:Java内存区域

    Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  2. JAVA 基础(1)开发环境的搭建以及开发工具的选择

    ​  我们现在还是在学习阶段因此我们不用配置那么多的jdk,配置一个jdk8就够应付日常的学习了.前面的文章我尽量写详细一些照顾刚入坑的朋友.后文还有教大家怎么使用企业版的idea. 一.开发环境的搭 ...

  3. Hadoop基础教程之搭建开发环境及编写Hello World

    整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclipse方便. 1.下载 进入官网:http://eclipse.org/do ...

  4. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  5. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...

  6. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  7. Android基础新手教程——1.2 开发环境搭建

    Android基础新手教程--1.2 开发环境搭建 标签: Android基础新手教程 如今主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio ...

  8. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

  9. Java基础教程:HashTable与HashMap比较

    Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...

随机推荐

  1. MysqliDb 库的一些使用简单技巧(php)

    一.分页功能 假设接口要接受输入:page, page_limit,key,value,table 来查询 table 中 key like value 的元组中以 page_limit 为 page ...

  2. javassist学习

    最近学习了javassist的使用方法. javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等. 下面是如果用javassist来动态创建一个类的demol 我们需要创建的目标类, ...

  3. Utils工具方法集插件详解

    var Utils = function(){}; Utils.text = { stripTags: function (val) { return val.replace(/<\/?[^&g ...

  4. 敏感词过滤的算法原理之DFA算法

    参考文档 http://blog.csdn.net/chenssy/article/details/26961957 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有 ...

  5. SpringBoot整合MyBatis及Thymeleaf

    http://www.cnblogs.com/ludashi/archive/2017/05/08/6669133.html 上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建. ...

  6. php解析word,获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

  7. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  8. Welcome! This is the documentation for Python 3.6.8

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  9. 使用二叉搜索树实现一个简单的Map

    之前看了刘新宇大大的<算法新解>有了点收获,闲来无事,便写了一个二叉搜索树实现的Map类. java的Map接口有很多不想要的方法,自己定义了一个 public interface IMa ...

  10. stark - 5 ⇲ 其他常用功能

    Ⅰ 排序 当数据量增多,对于数据 我们应该能够指定如何排序的.且此功能应该是可以给用户自定义进行配置的. 这是StarkHandler类的方法1 order_list = [] def get_ord ...