对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:UsersxlWuDesktop小练习>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文件在硬盘上不存在,看不到。
 
原文地址:https://www.cnblogs.com/xlwu/p/13052684.html