通常把Java文件分为编译时
和运行时
,通过javac
命令将.java文件编译成字节码
Java源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同平台上运行时不需要进行重新编译.Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令.
示例:
- 创建一个
Test.java
文件
/*************************************************************************
> File Name: Test.java
> Author:
> Mail:
> Created Time: 2019年08月28日 星期三 15时34分04秒
************************************************************************/
public class Test
{
public static void main(String[] args){
int i = 5;
int j = 6;
System.out.println(i + j);
}
}
- 编译Java文件
# panghu @ ubuntu18 in ~/Desktop/com/test/demo [16:29:11]
$ javac Test.java
# panghu @ ubuntu18 in ~/Desktop/com/test/demo [16:29:13]
$ ls
Test.class Test.java
- 查看.class文件
使用javap -c
命令查看指定文件
这里可以发现一点,编译器会在未指定构造函数的时候,默认创建一个无参构造方法
注意:如果指定了package需要在对应的包下才能执行,否则会抛出找不到主类的异常.
为什么JVM不直接将源码解析成机器码去执行
- 准备工作:
如果直接解析成机器码去执行,每次执行都需要进行各种检查,存在一定的时间和性能上的消耗 - 兼容性:
可以将其他的语言解析为字节码 (如Groovy),在JVM上面执行
参考课程:https://www.imooc.com/search/?words=%E5%89%91%E6%8C%87offer