内容概述
在java的世界里,我们离不开三个核心的概念,这是java世界的基石。他们分别是java语言、JVM、JDK。
本章的学习目标是深刻理解java语言、JVM、和JDK。
并额外需要理解一个classpath这个概念。以及要知道java程序运行时都需要经历哪些环节。
前置阅读
本章涉及到的一些术语如下:
1.java源代码
使用java语言书写的内容称为java源代码。存储java源代码的文档叫做java源文件。java源文件通常以.java后缀命名。它包含了程序的逻辑和结构。源代码是人类编写的,具有可读性,使用英语单词和标准编程语法。
2.java字节码
字节码是java源代码的最终形态。字节码是可以被JVM直接执行的指令集。Java的字节码是Java源代码通过Java编译器(javac
)编译后生成的一种中间代码形式。它不是特定于某一种计算机硬件的机器代码,而是一种平台无关的指令集,可以在任何支持Java虚拟机(JVM)的设备上运行。因此,Java程序具备了"一次编写,到处运行"的跨平台特性。
3.java程序
java程序其实就是字节码的集合。我们使用java语言写程序时,可能会需要写很多很多的源文件,这些源文件编译后就会产生很多的字节码文件,他们一起组成了java程序。
4.编译
编译是java开发中的一个环节,他的核心任务是把java源代码转化成java字节码。编译的过程一般会经历词法分析、语法分析、语义分析、生成字节码、验证字节码、优化字节码这几个步骤。
5.环境变量
环境变量本身是操作系统当中的一个概念,何为环境?在java开发中我们可以把我们使用的操作系统理解为环境。何为变量?他是一个标识符,它存储在操作系统里,我们可以给他设置一个字符串,作为它的值。
JAVA_HOME变量
- 作用:指定Java开发工具包(JDK)或Java运行时环境(JRE)的安装路径。对于开发Java程序的用户和系统,设置
JAVA_HOME
变量可以方便程序访问JDK。 - 示例:
JAVA_HOME=D:\Program Files\Java\jdk1.8.0_431
- 常见用途:
JAVA_HOME也
被许多Java工具(如Maven、Tomcat等)用来确定Java安装路径。
对于我们的初学者来说,可以不用太纠结这个变量的意义。
基础概念
一.java语言
即是语言,那么它的核心任务就是表达,表达什么呢?表达的是开发者的思想、解决问题的步骤和方法。那么java语言就是定义了一套如何进行这种表达的规范。这就是java语言。
二.JVM Java Virtual Machine
全称Java Virtual Machine,翻译过来就是java虚拟机。它的核心任务是执行java程序。既然有执行程序的能力,那么它在设计上应该是与真实的计算机系统的核心是一样的。即叫它虚拟机,那么它就是用计算机程序模拟真实计算机系统的一个实现。也就是说JVM也是一个运行在真实计算机上的一个程序,这个JVM程序的任务就是运行java程序。由此可见java程序并不直接运行在真实的物理计算机上。
三.JDK Java Development Kit
全称Java Development Kit,翻译过来就是java开发工具。即是工具,那它就是服务于java开发工作的。它主要包括了以下内容:
- 一套工具集,例如javac(编译器)、java(jvm启动器)等。
- 一个可以运行java程序的JVM,例如hotspot虚拟机。
- java基础库。
我们在平时的工作中可能还有遇到jre这个东西,它的全称叫做Java Runtime Environment,翻译过来就是java运行时环境。其实他就是jdk的精简版,它仅保留了一个可以运行java程序的JVM和一些运行java程序时必要的工具。它不具备开发的能力,它只能运行一个已经开发好的java程序。
实践
这里我们要写一个java程序,并编译运行它。来体会java语言、jvm、jdk他们的作用和他们之间的关系。以及运行java程序的各个环节。并引入classpath这个概念。
安装JDK
做java开发的第一个任务就是安装jdk,jdk有很多的版本,但是我们在这个阶段先不要在意其版本,可以随便找一个版本下载下来,然后把版本这个概念从你的脑海中移除掉,你就把他当作是上面讲到的JDK即可。这里我们就使用oracle维护的jdk1.8.0_431来学习,本专栏余下的章节也都基于这个jdk进行讲解。
jdk的下载,你可以自行到oracle的官网上下载,大版本选择jdk8就行。也可以从我的csdn资源上下载。下面时两种下载方式的链接
CSDN资源下载:https://download.csdn.net/download/yjy000/90100162
Oracle下载:Java Downloads | Oracle Australia
注意去oracle官网下载最好下载压缩版,这样在后面的讲解中能更具象的认识jdk。下载下来后是下面这样一个zip压缩包,里面包含了jdk所有的内容。
现在我们把这个文件解压一下看看里面的目录结构。
jdk提供的工具都在bin目录下。
安装jdk其实就是把压缩包里面的内容解压出来,就安装成功了。为了方便使用,我们需要配置一下环境变量,以便我们能够在任何地方打开一个命令行就能使用jdk提供的各种工具了。
下面我们来简单配置一下这个刚下载下来的jdk
配置环境变量PATH
PATH是操作系统里面的一个标准的环境变量,他是干什么用的呢?当我在命令行里输入一个程序名称时,比如我输入javac这个程序,那么操作系统去哪里找这个程序呢?就是通过PATH指定的一系列路径里去搜索,找到了就执行这个程序,找不到就会提示错误信息。
所以配置环境变量的目的仅仅是为了方便使用,不要把他想的太复杂。配置环境变量后,我们在任何地方随便打开一个命令行输入java命令都可以成功执行,如果不配置的话,你想要执行java命令就得输入它的绝对路径。仅此而已。
现在我们把刚才解压的jdk的路径添加到PATH这个变量里面去,特别注意要在你解压的路径后面加上\bin,因为jdk提供的工具都在这个bin目录下。
然后一路点击确定。然后我们打开命令行,在里面输入java -version,观察其输出。
可以看到是我们刚才下载的那个版本。说明jdk安装成功。接下来我们要开发一个java程序。
用java语言写代码
我们创建一个干净的空目录。如下:
E:\jcourse\lession1
我们在这个目录里创建一个HelloWorld.java的源文件
然后在这个文件里输入以下内容,保存。这里我们不深入探讨java的语法与书写规则,如果你是零基础的话,这里直接复制粘贴进去就行,关于语法与程序结构相关的内容我们将再第二章详细讲解。这里我们只是通过这个程序来了解JDK、JVM、和java语言之间的关系,以及他们是如何配合运作的。
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
代码解析:
public class HelloWorld 定义一个名为HelloWorld的类
public stati void main(String[] args) 定义了一个main方法。
System.out.println("HelloWorld!") 向命令行窗口打印HelloWorld!字符串。
main方法是Java程序执行的入口。
编译HelloWorld.java
java源代码是无法被直接运行的,我们要想在JVM中运行我们写的程序就必须把我们写的源代码转化成java字节码,这是通过编译这一步来完成的,编译源代码我们需要用到一个工具,叫做java编译器,这个编译器是JDK提供的,它就是javac.exe程序,存在于jdk的bin目录下。
编译一个java源文件很简单,只需要输入以下命令即可:
javac HelloWorld.java
我们必须要进入到HelloWorld.java所在的目录执行如下的命令,当然如果你不进入到这个目录下你就需要输入HelloWorld.java的完整的绝对路径。
可以看到命令执行完成后没有任何的输出,说明编译成功了,在这个目录下会生成一个HelloWorld.class文件,.class文件里存储的内容就是java字节码。
现在我们的第一个java程序就开发完成了,它只包含了一个HelloWorld.class文件。现在我们就要来执行这个程序了。
执行java程序
要想运行我们写的程序,我们就必须启动一个JVM,在jdk的bin目录下有一个java.exe程序,这就是用来启动JVM的启动器。
JVM运行一个java程序,他都干了些什么。
我们说过java程序就是字节码的集合,那么很明显JVM要想运行这些字节码就必须要知道这些字节码是什么,所以JVM运行java程序的第一步就是加载本程序包含的所有字节码文件。
那么JVM去哪里加载这些文件呢?这里我们就要引出classpath这个概念了。classpath指的就是JVM去哪里加载字节码文件,它是java命令的一个参数。例如:
java -classpath <path/to/class>
这样JVM在启动的时候就会去path/to/class这个路径下面加载class文件了。如果没有指定-classpath怎么办呢?没关系,java有一个默认的classpath,那就是当前目录,也就是你在哪里执行的java命令哪里就是当前目录。
比如,我现在进入到下面的目录里
E:\jcourse\lession1
这里有我编译好的HelloWorld.class文件,那么我就可以直接执行:
java HelloWorld
java命令后面跟的参数是一个类名,而且这个类里面必须包含一个main方法。我们写的这个程序正符合这样的要求。这个命令执行后会产生如下效果:
1. java在当前路径,也就是E:\jcourse\lession1下搜索所有的.class文件,并将其加载进JVM里。
2. 通过HelloWorld这个名称找到对应的类。
3. 找到HelloWorld这个类后,运行其中定义的main方法。
我们就得到了下面的输出结果。
可以看到我们写的程序运行了。
下面我们来做另外一个实验
首先我们把我们的命令行切换到其他的目录下,比如:
D:\workspace\bgzs
好了,现在我们的状态变成了下面这样
D:\workspace\bgzs 我的命令行所在的目录。
E:\jcourse\lession1 我的java程序,也就是HelloWorld.class所在的目录。
现在我们再次执行下面的命令,看看会发生什么。
java HelloWorld
可以看到,java告诉我们无法找到类HelloWorld。这是因为我们没有给java指定classpath,那么java就会在当前路径(D:\workspace\bgzs)下加载class文件,但是我们的class文件并不在这里,而是在E:\jcourse\lession1 这里。所以出现这个问题也就解释通了。下面我们给java指定正确的classpath后再执行一次看看是什么效果。
java -classpath E:\jcourse\lession1 HelloWorld
可以看到,我们写的java程序又正常运行了。
总结
三大核心基石
java语言是程序员用来写java源代码的一套规范,它为java程序提供最原始的素材,也就是我们用java语言编写的一个个的java源文件,这些源文件通过JDK提供的工具,被编译成一个个的字节码文件,这些字节码文件共同组成了java程序。然后JVM加载这些字节码文件去运行这个java程序。这就是java世界里的三大基石的作用以及他们互相之间的联系。
classpath
classpath是java命令的一个参数,它指定了一个路径也可以是多个路径或者java的库文件(jar文件),这些路径、jar文件里包含了class文件。classpath指示JVM去哪里加载这些class文件。
java程序运行的流程
1. 我们要执行java命令,并告诉java命令,class path在哪里,要运行的主类的类名是什么。
2. java在执行的时候会启动一个JVM,并告诉JVM去哪里加载class文件,以及要执行的主类是什么。
3. JVM启动后,去classpath指定的地方加载class文件,然后找到主类,并执行主类里面的main方法。
以上就是本章的所有内容,如有不明可以给作者发私信留言等。
标签:java,字节,程序,HelloWorld,第一章,JVM,Java,基石 From: https://blog.csdn.net/yjy000/article/details/144309384