对Java的加载与执行的理解(理论比较重要)
java程序从编写到最终运行经历了哪些过程?
java程序非常重要的两个阶段:
编译阶段
运行阶段
注意:Java程序员直接编写Java代码(普通文本)是无法执行被JVM识别的。Java程序员编写的Java代码这种普通文本必须经过一个编译,将这个“普通文本代码”变成“字节码”,JVM能够识别“字节码”。
Java代码这种普通文本变成字节码的过程,被称为:编译。
Java代码这种普通文本被称为:java源代码。(你编写的代码是源代码)
源代码不能直接执行,需要先进行编译,生成源代码对应的“字节码”。
JVM可以识别的是字节码。
编译阶段和运行阶段可以在不同的操作系统上完成吗?
在windows上编译
编译之后生成了“字节码”。
把“字节码”放到Linux上运行。
完全可以,因为Java是跨平台的。
可以做到一次编写到处运行。
Java源代码一旦编译之后,源代码可以删除吗?只留下字节码可以执行吗?
完全可以执行,因为源代码不参与程序的执行过程。
参与程序执行过程的是字节码。
但是最好不要删除源代码。因为有可能执行结果不是你需要的,当执行结果不是你需要的时候,你可以重新打开源代码进行修改,然后重新编译生成新的字节码,再重新执行。这样会有新的执行效果。
放源代码的文件扩展名必须是:xxx.java
并且需要注意的是:编译生成字节码文件扩展名是:xxx.class
没有为什么,死记硬背吧!!!
.java文件就是源文件,在这个文件中编写源代码。
.class文件就是字节码文件,这个文件是编译源代码而得到的。
另外需要注意的是:
1个Java源文件是可以编译生成多个class文件的。
最终运行的是class文件。
字节码文件是二进制文件吗?
字节码文件不是二进制文件。
如果是二进制的话,就不需要JVM(Java虚拟机)了。
因为操作系统可以直接执行二进制。
程序员到底要什么呢?
新建Java文件。
打开Java文件。
写Java源代码。
保存。
javac命令编译。
java命令运行
编写、编译、运行。
我们一起来研究一下:“java HelloWorld”的执行过程以及原理。
C:\Users\xlWu\Desktop\小练习>java HelloWorld
敲完回车,都发生了什么????
第一步:会先启动JVM(java虚拟机)
第二步:JVM启动之后,JVM会去启动“类加载器classloader”
类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。
假设是“java Test”,那么类加载器会去硬盘上搜索:“Test.class”文件。
.....
第三步:类加载器如果在硬盘上找不到对应的字节码文件,会报错,会报什么错误?
错误:找不到或无法加载主类。
类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码文件装载到JVM当中,JVM启动“解释器”将字节码解释为“1000010100...”这种二进制码,操作系统执行二进制码和硬件交互。
问题????
默认情况下,类加载器去硬盘上找“字节码文件”的时候默认会去哪里开始找。
默认情况下类加载器(classloader)会从当前路径下开始找。
此处应该有疑问?你可以提出那些问题?
能不能给类加载器指定一个路径?让类加载器去指定的路径下加载字节码文件。
答案:可以的。但是我们需要设置一个环境变量,叫做:classpath
(了解即可,不需要掌握,现阶段也不需要这样写)
再高版本的JDK当中,有这样的一个新特性,可以直接这样一步到位:
java x/y/z/xxx.java
java后面直接加java源文件的路径。
这个特性是为了简化开发而提出的,但实际上底层的实现原理还是和以前一样的。
以上命令在执行过程中,还是会先进行编译,然后在运行。并且以上的运行方式,编译生成的class文件在硬盘上不存在,看不到。