Java的编译与运行

前言

  • Java同时具有编译和解释特点,故其是混合型语言
  • Java的平台独立性依赖于JVM,能在不同的OS下运行Java程序
  • main方法就是入口方法,在class中并非必须有,标准签名如下:
    • public static void main(String[] args)
  • 源码层面来看:编译阶段依赖于"javac.exe",运行阶段依赖于"java.exe"

首先是编译阶段

  • 开发者首先在一个工作区创建java源文件,扩展名为".java",并利用编辑器编写Java程序源码
  • 在cmd或PowerShell运行javac.exe文件,即javac命令
    • 语法:javac + 源文件的路径(相对路径和绝对路径均可)
    • 绝对路径和相对路径区别:
相对路径 绝对路径
说明 相对于当前工作目录 从根目录开始的完整路径
示例(Windows) src\Main.class C:\project\src\Main.class
  • java编译器会将java源码编译为1~n个字节码文件,取决于Java程序源码的写法(class的个数)
    注意:字节码文件不是机器码文件,不能被机器以及os直接运行

其次是运行阶段(翻译)

  • 运行java.exe文件,即java命令
    • 语法:java + 类名
    • 补充:类名即字节码文件名(无扩展名)
      • eg. test.class,"test"为类名
  • 具体过程:
    1. 首先启动JVM
    2. 其次才会启动类加载器(classloader),它会在环境变量classpath中寻找"类名.class"文件,会按照classpath的顺序依次搜索,找到第一个即停止,找不到会报错
    3. 如果用户未配置classpath,则默认当前路径下寻找,找不到则报错
    4. 最后JVM会将得到的字节码文件翻译为机器码文件,以便OS执行后与硬件平台交互

classpath和path的区别

  • classpath:字节码文件环境变量,java命令寻找类文件的死地址,支持多路径(以分号分隔) 如果用户将该路径写死了,则java命令单单只从classpath路径下寻找,找不到则报错,所以当需要引入第三方库 时,才会配置classpath
    1. 未配置classpath时:
      • 默认在当前目录查找类文件
      • 例如:在C:\project目录执行java Main,会查找C:\project\Main.class
    2. 已配置classpath时:
      • 只在classpath指定的路径中查找,不会自动查找当前目录
      • 这是常见错误:配置了classpath后当前目录的类反而找不到
    3. 现代JDK(9+)补充:
      • 降低了对classpath的依赖
      • 但基本查找逻辑不变
  • path:运行窗口运行文件除当前路径外寻找的地址
    • 用户环境变量:只有当前用户登陆电脑时生效
    • 系统环境变量:登录该电脑的所有用户均生效
  • 二者主要区别:classpath是固定地址,找不到就找不到;而path找不到也会在当前目录下查找

public class与class的区别

public class class
修饰的类名必须与源文件名保持一致,一个源文件中仅有一个 可以有多个,但是不能重名
公开,其他包可访问 只能在同一个包内访问 不同包则无法访问
相关推荐
Jabes.yang2 个月前
互联网大厂Java求职面试实战解析(含技术场景与详解)
spring boot·微服务·面试·orm·技术栈·java se·jakarta ee
编程彩机6 个月前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
编程火箭车6 个月前
【Java SE 基础学习打卡】37 二维数组
二维数组·数组遍历·java se·java 基础·二维数组初始化·不规则二维数组·表格型数据存储
编程火箭车7 个月前
【Java SE 基础学习打卡】36 数组的常见操作
冒泡排序·java se·java 基础·线性查找·数组常见操作·数组增删改·数组拷贝
编程火箭车7 个月前
【Java SE 基础学习打卡】35 数组元素的访问与遍历
数组索引·java se·java 基础·java 数组·数组元素访问与遍历·普通 for 循环·增强 for 循环
编程火箭车7 个月前
【Java SE 基础学习打卡】34 数组的定义与初始化
java se·java 基础·java 数组·数组定义与初始化·静态初始化·动态初始化·length 属性
编程火箭车7 个月前
【Java SE 基础学习打卡】33 数组的概述
java se·java 基础·数组概述·数组核心特征·java 数组·批量存储数据·连续内存存储
编程火箭车7 个月前
【Java SE 基础学习打卡】32 方法的嵌套调用与递归调用
java se·java 基础·java 方法·方法嵌套调用·方法递归调用·递归终止条件·递归应用场景
编程火箭车7 个月前
【Java SE 基础学习打卡】31 方法的返回值与void关键字
java se·java 基础·return 语句·编程小白入门·java 方法·方法返回值·void 关键字