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"为类名
- 具体过程:
- 首先启动JVM
- 其次才会启动类加载器(classloader),它会在环境变量classpath中寻找"类名.class"文件,会按照classpath的顺序依次搜索,找到第一个即停止,找不到会报错
- 如果用户未配置classpath,则默认当前路径下寻找,找不到则报错
- 最后JVM会将得到的字节码文件翻译为机器码文件,以便OS执行后与硬件平台交互
classpath和path的区别
- classpath:字节码文件环境变量,java命令寻找类文件的死地址,支持多路径(以分号分隔) 如果用户将该路径写死了,则java命令单单只从classpath路径下寻找,找不到则报错,所以当需要引入第三方库时,才会配置classpath
- 未配置classpath时:
- 默认在当前目录查找类文件
- 例如:在C:\project目录执行java Main,会查找C:\project\Main.class
- 已配置classpath时:
- 只在classpath指定的路径中查找,不会自动查找当前目录
- 这是常见错误:配置了classpath后当前目录的类反而找不到
- 现代JDK(9+)补充:
- 降低了对classpath的依赖
- 但基本查找逻辑不变
- 未配置classpath时:
- path:运行窗口运行文件除当前路径外寻找的地址
- 用户环境变量:只有当前用户登陆电脑时生效
- 系统环境变量:登录该电脑的所有用户均生效
- 二者主要区别:classpath是固定地址,找不到就找不到;而path找不到也会在当前目录下查找
public class与class的区别
| public class | class |
|---|---|
| 修饰的类名必须与源文件名保持一致,一个源文件中仅有一个 | 可以有多个,但是不能重名 |
| 公开,其他包可访问 | 只能在同一个包内访问 不同包则无法访问 |

浙公网安备 33010602011771号