前言
Java程序从编写到最终运行大概可概括为3个阶段:编写、编译、运行阶段。
一、编写阶段
- 程序员在硬盘某个位置新建一个xxx.java文件
- 使用记事本或者其他文本编辑器例如EditPlus打开xxx.java文件
- 在xxx.java文件中编写符合Java语法规则的源代码
- 保存源代码
二、编译阶段
- 使用编译器(javac.exe【JDK安装后自带】)将 xxx.java文件编译为 xxx.class文件。如果 xxx.java文件中编写的源代码是符合语法规则的,编译会通过并生成xxx.class字节码文件;如果xxx.java文件中的源代码不符合语法规则,则编译不会通过,也不会生成xxx.class字节码文件。一个java源文件是可以生成多个class文件的。(编译实际上是检查语法)
- java命令格式:javac java源文件的路径(路径有绝对路径和相对路径之分)
- xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,那么我们称A是一个类,B是一个类,C是一个类。其中A、B、C是类的名字。
三、运行阶段(JRE起作用)
- 使用JDK自带的一个命令/工具:java.exe(负责运行的命令/工具)执行字节码文件
- java命令格式:java 类名
- 执行java程序的步骤:
<1>.先使用cd命令切换到Test.class文件所在的路径。
<2>.执行java 类名
【java这个命令,后面跟的是“类名”,而绝对不能跟“文件路径”,因为java命令后面跟的不是文件,是一个“类名”。所以必须先切换到class文件所在路径,也是为了能让类加载器能够找到该class文件。】 - 往下的步骤就全部交给JVM了,就不需要程序员进行干涉了。当执行java 类名回车以后,会经历以下步骤:
<1>. 会先启动JVM(java虚拟机)
<2>. JVM启动之后,JVM会去启动“类加载器classloader”
类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。
假设是“java Test”,那么类加载器会去硬盘上搜索:Test.class文件。
<3>. 类加载器如果在硬盘上找不到对应的字节码文件,会报错:找不到或无法加载主类
类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码
文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000…”这种
二进制码,操作系统执行二进制码和硬件交互。
默认情况下,类加载器去硬盘上找“字节码”文件的时候,默认情况下类加载器(classloader)会从当前路径下找。因此在运行时要先先使用cd命令切换到Test.class文件所在的路径。也可以设置一个环境变量classpath给类加载器指定一个路径,让类加载器去指定的路径下加载字节码文件。
JVM会通过类加载器将字节码文件装载进去,然后JVM对字节码进行解释,将字节码解释为机器指令(二进制码)。JVM会将生成的二进制码交给OS操作系统,操作系统会执行二进制码和硬件进行交互。
总结
Java程序从编写到编译再到运行是一次完整的加载与执行过程。程序员写的源代码为xxx.java文件,源代码是无法直接被JVM识别。Java程序员编写的代码必须经过编译,将源代码编译为字节码,JVM能够识别字节码文件并将其解释并执行。
.java文件就是源文件,这个文件中编写源代码
.class文件为编译后的字节码文件。
javac命令负责编译
java命令负责运行
java程序的编译和运行过程可以在不同的操作系统上完成。因为java是跨平台的。
java源代码一旦编译之后,如果将源代码删除,只保留字节码文件也是可以执行的,因为参与运行的是字节码。但是最好不要把源程序删除,以防后期需要进行修改。
字节码文件不是二进制文件,它只是接近于二进制的字节码,需要由JVM解释为二进制然后被执行。