前言

Java程序从编写到最终运行大概可概括为3个阶段:编写、编译、运行阶段。

一、编写阶段

  1. 程序员在硬盘某个位置新建一个xxx.java文件
  2. 使用记事本或者其他文本编辑器例如EditPlus打开xxx.java文件
  3. 在xxx.java文件中编写符合Java语法规则的源代码
  4. 保存源代码

二、编译阶段

  1. 使用编译器(javac.exe【JDK安装后自带】)将 xxx.java文件编译为 xxx.class文件。如果 xxx.java文件中编写的源代码是符合语法规则的,编译会通过并生成xxx.class字节码文件;如果xxx.java文件中的源代码不符合语法规则,则编译不会通过,也不会生成xxx.class字节码文件。一个java源文件是可以生成多个class文件的。(编译实际上是检查语法)
  2. java命令格式:javac java源文件的路径(路径有绝对路径和相对路径之分)
  3. xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,那么我们称A是一个类,B是一个类,C是一个类。其中A、B、C是类的名字。

三、运行阶段(JRE起作用)

  1. 使用JDK自带的一个命令/工具:java.exe(负责运行的命令/工具)执行字节码文件
  2. java命令格式:java 类名
  3. 执行java程序的步骤:
    <1>.先使用cd命令切换到Test.class文件所在的路径。
    <2>.执行java 类名
    【java这个命令,后面跟的是“类名”,而绝对不能跟“文件路径”,因为java命令后面跟的不是文件,是一个“类名”。所以必须先切换到class文件所在路径,也是为了能让类加载器能够找到该class文件。】
  4. 往下的步骤就全部交给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解释为二进制然后被执行。

Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程相关推荐

  1. 【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...

  2. Fragment的懒加载与生命周期详解

    提示:本文仅为笔者学习记录 Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCr ...

  3. android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解

    Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...

  4. JAVA消息服务JMS规范及原理详解

    一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进 ...

  5. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  6. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  7. java object数组转实体类_详解Java中String JSONObject JSONArray List实体类转换

    JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: "com.alibaba", name: "fastjson&quo ...

  8. java实现的微服务架构_详解Java 微服务架构

    一.传统的整体式架构 传统的整体式架构都是模块化的设计逻辑,如展示(Views).应用程序逻辑(Controller).业务逻辑(Service)和数据访问对象(Dao),程序在编写完成后被打包部署为 ...

  9. windows下c/c++创建Java虚拟机加载可执行jar包

    一般的,我们使用java.exe或者javaw.exe来执行我们的java应用程序.但是实际上这两个可执行程序只是java虚拟机的启动器,使用java.exe将会创建一个控制台窗口用于输出,而java ...

最新文章

  1. STATIC_URL/STATIC_ROOT/STATICFILES_DIRS/urls.py中的static区别
  2. 作者:秦兵(1968-),女,哈尔滨工业大学计算机科学与技术学院教授、博士生导师。...
  3. java zip追加_基于Java向zip压缩包追加文件
  4. mii-tool查看网卡状态
  5. python学习day02
  6. python 按从小到大的顺序组合成一个字典_Python 按照某个或某几个字段来排序字典列表...
  7. Visio2007产品密钥
  8. 2022年中式面点师(中级)复训题库及模拟考试
  9. [zz] 导致你创业失败的18个错误 [2007-05-03]
  10. ggplot2设置坐标轴范围_6.2 坐标轴:对连续变量设置坐标轴显示范围
  11. Netty源码解析-Netty内存泄露检测
  12. 微信绑定会员卡服务器出错,会员卡信息更新失败
  13. 青云云服务器怎么上传文件,青云QingCloud发布文件存储,进一步完善软件定义存储解决方案...
  14. 云付注册推荐人怎么填?云付新手怎么操作
  15. 今天感受了一下ipad
  16. 跳槽找工作避坑指南(2019最新新版)
  17. 编解码器的世界 - 从字幕组说起
  18. 矿区无人值守称重系统权限有哪些,怎么分配
  19. pyechart 详细地图_pyechart 详细地图_pyechart使用
  20. 今天是个好日子2014-12-01

热门文章

  1. [BZOJ 4916]神犇和蒟蒻
  2. Windows Mobile下C++取屏幕分辨率的方法
  3. JavaScript、HTML、CSS学习—思维导图
  4. Centos 7 更改网卡名字
  5. Python快速学习07:文本文件的操作
  6. 小型车、中型车、大型车、重型车的区分和定义见下表:
  7. Spring事务的传播行为和隔离级别
  8. 先判断对象是否为NULL再进行操作
  9. linux桌面服务器系统下载,Ubuntu 14.10 中文桌面版/服务器正式版下载
  10. Apollo创建项目